1

可以在我的控制器中爲我的模型綁定器調用一個靜態字段嗎?Unity IoC和MVC模型綁定

例如,

public class AuctionItemsController : Controller 
{ 
    private IRepository<IAuctionItem> GenericAuctionItemRepository; 
    private IAuctionItemRepository AuctionItemRepository; 

    public AuctionItemsController(IRepository<IAuctionItem> genericAuctionItemRepository, IAuctionItemRepository auctionItemRepository) { 
     GenericAuctionItemRepository = genericAuctionItemRepository; 
     AuctionItemRepository = auctionItemRepository; 
     StaticGenericAuctionItemRepository = genericAuctionItemRepository; 
    } 

    internal static IRepository<IAuctionItem> StaticGenericAuctionItemRepository; 

這裏是我使用Unity作爲國際奧委會ModelBinder的

public class AuctionItemModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     if (AuctionItemsController.StaticGenericAuctionItemRepository != null) { 
      AuctionLogger.LogException(new Exception("controller is null")); 
     } 

     NameValueCollection form = controllerContext.HttpContext.Request.Form; 

     var item = AuctionItemsController.StaticGenericAuctionItemRepository.GetSingle(Convert.ToInt32(controllerContext.RouteData.Values["id"])); 

     item.Description = form["title"]; 
     item.Price = int.Parse(form["price"]); 
     item.Title = form["title"]; 
     item.CreatedDate = DateTime.Now; 
     item.AuctionId = 1; 


     //TODO: Stop hardcoding this 
     item.UserId = 1; 

     return item; 
    }} 

,我覺得很奇怪在IoC容器註冊我的ModelBinder的。

我推薦的其他優秀設計考慮因素是什麼?

回答

3

不,我不會考慮這個好做法。一般而言,API設計的美妙之處在於,只要某些事物看起來很奇怪,就會引發精神警覺。關鍵字static對我有影響。

一旦開始使用靜態屬性,就沒有理由從Controlller獲取存儲庫 - 您可能也可以直接從容器中獲取它,這將暗示Service Locator anti-pattern。就像現在一樣,您將ModelBinder緊密耦合到一個特定的控制器,儘管似乎沒有任何理由要這樣做。從技術上講,你可以做你已經做的事情,但是要考慮它是否是正確的地方:現在你已經從存儲庫獲得了你的物品,爲什麼不立即再次保存它呢?這在技術上也是可能的,但這是對Single Responsibility Principle的嚴重違反。

想想ModelBinder的預期責任:它將HTTP/HTML上下文信息(以純文本形式給出)轉換爲強類型對象。而已。如果你試圖讓它做更多,你打破了SRP。

基於HTML Form/querystring值的脫水最好留給控制器本身。一旦控制器具有適當的域對象,它就可以將其交給域模型。這應該是財務主任的單一責任。在大多數情況下,您根本不需要ModelBinder。