【问题标题】:IModelBinder or IOC in ASP.NET MVC?ASP.NET MVC 中的 IModelBinder 或 IOC?
【发布时间】:2009-10-02 17:23:39
【问题描述】:
【问题讨论】:
标签:
asp.net-mvc
ioc-container
【解决方案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 的好处是什么?为什么它是关于 IoC 的?这有助于我使我的模型绑定器不受实体解析问题的影响,同时保留关注点分离。 id 是什么意思以及我们如何获得实体被委托给解析器。这有助于为任何实体重用相同的 IModelBinder。如果(如上所示)我想按名称而不是 id 搜索,我唯一需要做的就是提供模型解析器。
这里的 IoC(我使用服务定位器,但无论如何)有助于找到合适的解析器并实例化它。请注意,解析器接受 IRepository,IoC 容器会自动传递它。
关于你的具体问题,当然我们应该使用IoC with IModelBinder,不是没有——但你或许也可以使用IoC来实例化IModelBinder——这样就可以避免使用ServiceLocator;但我不知道如何拦截创建活页夹的 MVC,坦率地说,我不在乎,因为我对 Locator 很满意。
至于 KiGG,我通常建议不要依赖示例项目,例如 NerdDinner 或 Oxite(不能告诉任何关于 KiGG 的内容),就好像它们是“好的设计”参考一样——据我所知,它们通常展示技术方面(即功能),不是好的设计。
【讨论】:
-
-
他们都很好,也很有教育意义,但他们教的是 MVC,而不是设计。对我个人而言,Jimmy Bogard 的博客是对良好技术的深刻见解:lostechies.com/blogs/jimmy_bogard(他是 MVC In Action 的合著者,它使用 CodeCampServer 作为源代码示例,因此您可以在那里查看;我想说的不是完美的例子,但仍然)。