【问题标题】:Unity IoC and MVC modelbindingUnity IoC 和 MVC 模型绑定
【发布时间】:2010-05-19 11:44:20
【问题描述】:

可以在我的控制器中有一个静态字段供我的模型绑定器调用吗?

例如。

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;

这里是模型绑定器

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;
    }}

我使用 Unity 作为 IoC,我发现在 IoC 容器中注册我的模型绑定器很奇怪。

我还有什么其他好的设计考虑吗?

【问题讨论】:

    标签: model-view-controller dependency-injection unity-container


    【解决方案1】:

    不,我不会考虑这种好的做法。一般来说,API 设计的美妙之处,尤其是 DI 设计,就在于一旦某些东西开始看起来很奇怪,它就会触发心理警报。 static 关键字对我有这种影响。

    一旦您开始使用静态属性,就没有理由从 Controller 获取您的存储库 - 您不妨直接从容器中获取它,这意味着 Service Locator anti-pattern。就像现在一样,您将您的 ModelBinder 紧密耦合到特定的 Controller,尽管您似乎没有理由想要这样做。

    从技术上讲,你可以做你已经做过的事情,但要考虑它是否是正确的地方:既然你已经从存储库中获得了你的项目,为什么不立即再次保存它呢?这在技术上也是可行的,但严重违反了Single Responsibility Principle

    想想 ModelBinder 的预期职责:它将 HTTP/HTML 上下文信息(以纯文本形式给出)转换为强类型对象。而已。如果你试图让它做得更多,你就破坏了 SRP。

    基于 HTML 表单/查询字符串值的脱水最好留给控制器本身。一旦控制器有了合适的域对象,它就可以将它交给域模型。那应该是控制器的单一职责。在大多数情况下,您根本不需要 ModelBinder。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多