MVC 4 Autofac和Generic Repository模式

我正在使用我的MVC 4应用程序中的工作单元和通用存储库模式。 我试图解决的问题是为我系统中的每个实体创建Repository存根。 为了利用Autofac Ioc,我必须为每个实体创建一个存储库类和接口,以便我可以在Autofac中注册它。

应用开始……

builder.RegisterType().As().InstancePerHttpRequest(); 

存储库类

  public class SchoolDetailRepository : RepositoryBase, ISchoolDetailRepository { public SchoolDetailRepository(IDatabaseFactory databaseFactory) : base(databaseFactory) { } } 

接口

 public interface ISchoolDetailRepository : IRepository { } 

这似乎是一项额外的工作。

有没有办法注册Type的通用存储库而不是创建所有这些空类?

然后在我的服务类中,我可以通过Ioc将通用类型传递给构造函数,例如…

 public class SchoolService : ISchoolService { private readonly IRepository _schoolRepository; private readonly IUnitOfWork _unitOfWork; public SchoolService(IRepository schoolRepository, IUnitOfWork unitOfWork) { this._schoolRepository = schoolRepository; this._unitOfWork = unitOfWork; } } 

容器配置

 // Autofac iOC var builder = new ContainerBuilder(); // register controllers builder.RegisterControllers(Assembly.GetExecutingAssembly()); // register services builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); // register data infrastructure builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); // register repositories builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterType().As().InstancePerHttpRequest(); //builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterGeneric(typeof(RepositoryBase)).As(typeof(IRepository)); // build and setup resolver IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

exception来自上面的代码,你给我的表达式运行..

 builder.RegisterGeneric(typeof(RepositoryBase)).As(typeof(IRepository)); 

RepositoryBase

 public abstract class RepositoryBase where T : class { private LearningCompactPilotContext _dataContext; private readonly IDbSet _dbset; protected RepositoryBase(IDatabaseFactory databaseFactory) { DatabaseFactory = databaseFactory; _dbset = DataContext.Set(); } protected IDatabaseFactory DatabaseFactory { get; private set; } protected LearningCompactPilotContext DataContext { get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); } } ... more code 

}

您需要Autofac的开放式genericsfunction:

 builder.RegisterGeneric(typeof(RepositoryBase<>)) .As(typeof(IRepository<>)); 

然后你完全按照你的描述使用你的存储库:

 public class SomeService { private readonly IRepository _repository; public SchoolService(IRepository repository) { this._repository= repository; } }