什么是在MVC5中注册依赖项的正确方法

时间:2018-02-20 12:07:10

标签: c# asp.net-mvc unity-container

我在一个项目中创建了通用存储库:

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项目中初始化此服务的正确方法是什么?是否可以像下面描述的那样保持层依赖性?这层的依赖注入的正确方法是什么?

0 个答案:

没有答案