例如,在我的项目我有一个定制绑定,做这样的事情(我用它来与视图模型像显示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(我使用服务定位器,但无论如何)有助于找到合适的解析器并实例化它。注意,解析器接受IRepository,IoC容器自动通过。
关于你的具体问题,我们当然应该使用IoC的与 IModelBinder,不是没有 - 但你可能也使用IoC的实例IModelBinder - 这将避免需要使用服务定位;但我不知道如何拦截MVC创建活页夹,坦率地说,我不在乎,因为我对Locator感到满意。
至于KiGG,我通常建议不要依赖像NerdDinner或Oxite这样的示例项目(不能告诉任何关于KiGG的东西),就好像它们是“优秀设计”的参考 - 就我所见,他们通常会展示技术方面(即功能),不是很好的设计。
你是否推荐任何带有教育源代码的MVC项目? – rasx 2009-10-03 02:25:32
他们都很好,很有教育意义,但他们教MVC,而不是设计。对于我个人来说,Jimmy Bogard的博客是对优秀技术的深入了解:http://www.lostechies.com/blogs/jimmy_bogard/(他是MVC In Action中的作者,它使用CodeCampServer作为源代码的示例,因此您可以在那里看看;不是我想说的完美例子,但仍然)。 – queen3 2009-10-03 09:02:00