虽然Scott Hanselman在使用IModelBinder时表现出色 “IPrincipal (User) ModelBinder in ASP.NET MVC for easier testing”他觉得有必要做出这个相当防守的评论:
是的,我知道我也可以使用IoC容器。
他是否意味着他可以使用IOC 而不是 IModelBinder,或者他说我们应该将IModelBinder 与 IOC一起使用?理解为使用通用编程语言(现在我变得防御性)可以在现实场景中实际完成许多事情吗?例如,像KiGG这样的项目似乎根本没有使用IModelBinder。
答案 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/,这可能有所帮助。 我还添加了一个示例应用程序,如果您有任何问题,请告诉我。