專案定義抽象 ControllerBase 作為所有 Controller 父類,注入 IBaseControllerService 提供共用設定:
[Rescue("Default"), Authenticate, CopyMessageFromTempDataToViewData]
public abstract class ControllerBase : Controller, IProvidesBaseService {
private IBaseControllerService baseControllerService;
public IBaseControllerService BaseControllerService {
get { return baseControllerService; }
set {
baseControllerService = value;
ViewData["Title"] = "{0}{1} ".With(baseControllerService.ShopName, GetControllerName());
ViewData["MetaDescription"] = "\"{0}\"".With(baseControllerService.MetaDescription);
}
}
public ILogger Logger { get; set; }
public virtual string GetControllerName() { return " - {0}".With(GetType().Name.Replace("Controller", "")); }
public virtual void AppendTitle(string text) { ViewData["Title"] = "{0} - {1}".With(ViewData["Title"], text); }
public virtual void AppendMetaDescription(string text) { ViewData["MetaDescription"] = text; }
public string Message { get { return TempData["message"] as string; } set { TempData["message"] = value; } }
protected override void OnException(ExceptionContext filterContext) { Response.Clear(); base.OnException(filterContext); }
}
public interface IBaseControllerService {
IRepository<Category> CategoryRepository { get; }
string GoogleTrackingCode { get; set; }
string ShopName { get; set; }
string EmailAddress { get; set; }
string SiteUrl { get; }
string MetaDescription { get; set; }
string Copyright { get; set; }
string PhoneNumber { get; set; }
string SiteCss { get; set; }
}
public class BaseControllerService : IBaseControllerService {
public IRepository<Category> CategoryRepository { get; private set; }
public string GoogleTrackingCode { get; set; }
public string MetaDescription { get; set; }
private string shopName, emailAddress, copyright, phoneNumber, siteCss;
// 屬性實作略...
}
透過基類統一管理頁面標題、Meta、訊息傳遞與例外處理,配合 IOC 注入服務實現設定集中化。