2009-10-02 45 views
0

虽然斯科特Hanselman的在 “IPrincipal (User) ModelBinder in ASP.NET MVC for easier testing”进行使用IModelBinder的一个很好的示范,他觉得有必要让这个而防守评论:ASP.NET MVC中的IModelBinder或IOC?

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

他是说他可能已经使用IOC 代替 IModelBinder或者是他说我们应该用IModelBinder IOC?有了这样的理解,许多事情可以用通用编程语言来完成(现在我正在防御)真实世界中实际做了什么?例如,像KiGG这样的项目根本没有使用IModelBinder。

回答

1

例如,在我的项目我有一个定制绑定,做这样的事情(我用它来与视图模型像显示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的东西),就好像它们是“优秀设计”的参考 - 就我所见,他们通常会展示技术方面(即功能),不是很好的设计。

+0

你是否推荐任何带有教育源代码的MVC项目? – rasx 2009-10-03 02:25:32

+0

他们都很好,很有教育意义,但他们教MVC,而不是设计。对于我个人来说,Jimmy Bogard的博客是对优秀技术的深入了解:http://www.lostechies.com/blogs/jimmy_bogard/(他是MVC In Action中的作者,它使用CodeCampServer作为源代码的示例,因此您可以在那里看看;不是我想说的完美例子,但仍然)。 – queen3 2009-10-03 09:02:00

0

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