ASP.NET MVC中的IModelBinder或IOC?

时间:2009-10-02 17:23:40

标签: asp.net-mvc ioc-container

虽然Scott Hanselman在使用IModelBinder时表现出色 “IPrincipal (User) ModelBinder in ASP.NET MVC for easier testing”他觉得有必要做出这个相当防守的评论:

  

是的,我知道我也可以使用IoC容器。

他是否意味着他可以使用IOC 而不是 IModelBinder,或者他说我们应该将IModelBinder IOC一起使用?理解为使用通用编程语言(现在我变得防御性)可以在现实场景中实际完成许多事情吗?例如,像KiGG这样的项目似乎根本没有使用IModelBinder。

2 个答案:

答案 0 :(得分:1)

例如,在我的项目中,我有一个类似于此的自定义绑定器(我将它与ViewModel一起使用,如here所示):

public interface IEntityResolver
{
   object Find(string id);
}

public class PrimaryKeyResolver<T> where T: Entity
{
   public PrimaryKeyResolver(IRepository<T> repository) {}
   public object Find(string id)
   {
      return repository.Get(new Guid(id));
   }
}

public class NameResolver<T> where T: NamedEntity
{
   public NameResolver(IRepository<T> repository) {}
   public object Find(string id)
   {
      return repository.Find(new { Name = id });
   }
}

public class MyBinder: IModelBinder
{
   public override object BindModel()
   {
       var id = ... //get id from context
       var resolverType = typeof(IResolver<>).MakeGenericInterface(typeof(bindingContext.ModelType));
       var resolver = ServiceLocator.Current.GetInstance(resolverType);
       return resolver.Find(id);
   }
}

现在,有什么好处以及它与IoC的关系?这有助于我保持模型绑定器不受实体解析问题的影响,保留了关注点。 id的含义以及我们如何将实体委托给解析器。这有助于为任何实体重用相同的IModelBinder。我唯一需要做的就是提供模型解析器,如果(如上所示)我想按名称而不是id搜索。

这里的IoC(我使用Service Locator但是无论如何)有助于找到合适的解析器并实例化它。请注意,解析器接受IRepository,IoC容器会自动传递。

关于您的具体问题,我们当然应该使用IoC IModelBinder,而不是没有 - 但您也可以使用IoC来实例化IModelBinder - 这将避免使用ServiceLocator;但我不知道如何拦截MVC创建活页夹,坦白说我不在乎,因为我对定位器感到满意。

对于KiGG,我通常建议不要依赖NerdDinner或Oxite等示例项目(不能说出任何关于KiGG的内容),好像它们是“好的设计”参考 - 据我所知他们通常会展示技术方面(即特征),不是好的设计。

答案 1 :(得分:0)

我刚刚将此添加到codeplex http://mvcunity.codeplex.com/,这可能有所帮助。 我还添加了一个示例应用程序,如果您有任何问题,请告诉我。