使用IOC容器挂钩通用存储库

时间:2011-09-28 09:06:06

标签: asp.net-mvc-3 unity-container autofac

我正在尝试创建一个通用的存储库模式,我可以在其中打开ORM技术,但我在尝试与IOC容器挂钩时偶然发现了这个问题

 public interface IRepository<T>  
 {
      //members
 }

对于NHbernate,这很好用

public class FNHRepository<T>: IRepository<T> 
{ //members }

但对于Entity,我被迫添加where子句

public class EFRepository<T> : IRepository<T> where T : class 
{

如果我省略了“where子句”我无法做到

dbset = DataContext.Set<T>() ; 

说只有参考类型可以用作T

当我试图将IRepository与IOC挂钩时,问题就出现了,就像这样

.RegisterType(typeof(IRepository<>), typeof(EFRepository<>)); 

如果实现类的其中T:class ,我无法挂钩界面,我得到以下执行

xception is:InvalidOperationException - 当前类型System.Web.Mvc.IControllerFactory是一个接口,无法构造。你错过了类型映射吗?

任何帮助appriciated,我尝试使用Unity和Autofac并得到相同的错误

1 个答案:

答案 0 :(得分:0)

不确定Unity,但是你应该能够注册一个带有约束的泛型类。

builder.RegisterGeneric(typeof(EFRepo...))
    .AsImplementedInterfaces();

问题是这样的:在接口上没有相同的约束,这必然会失败:

container.Resolve<IRepo<int>>();