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; } }