我在一个项目中创建了通用存储库:
public abstract class GenericRepository<C, T> : IGenericRepository<T>
where T : class
where C : IdentityDbContext, new()
{
private C _entities = new C();
public C Context
{
get { return _entities; }
set { _entities = value; }
}
public virtual void Add(T obj) => _entities.Set<T>().Add(obj);
public virtual void Delete(T obj) => _entities.Set<T>().Remove(obj);
public virtual void Edit(T obj) => _entities.Entry(obj).State = EntityState.Modified;
public virtual IQueryable<T> GetAll() => _entities.Set<T>();
public virtual IQueryable<T> FindBy(Expression<Func<T, bool>> predicate) => _entities.Set<T>().Where(predicate);
public virtual void Save() => _entities.SaveChanges();
}
在其他项目中使用存储库的服务类:
public class FuelService : IFuelService
{
private readonly IGenericRepository<Fuel> _fuelRepository;
public FuelService(IGenericRepository<Fuel> fuelRepository)
{
_fuelRepository = fuelRepository;
}
public Fuel GetById(int fuelId) => _fuelRepository.FindBy(x => x.Id == fuelId).FirstOrDefault();
public void Add(Fuel obj) => _fuelRepository.Add(obj);
public void Delete(Fuel obj) => _fuelRepository.Delete(obj);
public void Edit(Fuel obj) => _fuelRepository.Edit(obj);
public IQueryable<Fuel> FindBy(Expression<Func<Fuel, bool>> predicate) => _fuelRepository.FindBy(predicate);
public IQueryable<Fuel> GetAll() => _fuelRepository.GetAll();
public void Save() => _fuelRepository.Save();
}
接下来我创建了bootstrap项目,在静态方法中注册类型如下
container.RegisterType<IGenericRepository<Fuel>, GenericRepository<TourContext, Fuel>>();
container.RegisterType<IFuelService, FuelService>();
此类包含存储库项目,ef上下文项目和服务项目之间的依赖项。存储库项目引用了EF上下文项目,服务引用了存储库。 MVC参考了服务。在MVC项目中,我想只使用服务(1引用服务)。如果我尝试在MVC项目中使用Unity注册类型,我必须引用存储库项目。在MVC项目中初始化此服务的正确方法是什么?是否可以像下面描述的那样保持层依赖性?这层的依赖注入的正确方法是什么?