通用接口和简单注入器的依赖注入

时间:2017-01-31 21:21:00

标签: c# asp.net generics dependency-injection simple-injector

我正在尝试使用Simple Injector和ASP.NET Core实现依赖注入。我有一个服务类库和另一个用于使用存储库进行数据访问的类库。我的问题是,我已经在我的启动类(web api)中实现了依赖注入来引用我的服务。现在我需要在存储库的注入依赖项服务中执行相同的操作。但是我的类库(服务类库)中没有启动类,所以我该怎么做呢?

public interface IBaseService<TEntity> where TEntity : class
    { }

帐户服务

    public interface IAccountService : IBaseService<User>
{ }


 private readonly IAccountRepository _repository;
    private readonly IUnitOfWork _unitOfWork;

    public AccountService(IAccountRepository repository, IUnitOfWork unitOfWork) : base (repository, unitOfWork)
    {
        _repository = repository;
        _unitOfWork = unitOfWork;
    }

存储库(在不同的类库中):

   public interface IBaseRepository<TEntity> where TEntity : class
{}

1 个答案:

答案 0 :(得分:1)

您的问题可归结为以下简单问题:

  

我们应该在哪里构建对象图?

这个问题的答案是:

  

尽可能接近应用程序的入口点。

此入口点通常称为Composition Root

换句话说,所有您的依赖项应该在组合根中连接,而与它们所在的层无关。您的组合根本身就是一个层,它知道系统的每个其他部分(如here所述)。

因此,考虑到显示的代码,您的Composition Root可能如下所示:

container.Register<IAccountService, AccountService>();
container.Register<IAccountRepository, AccountRepository>();
container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);

简而言之,库没有组合根,并且您没有在库本身中连接依赖项。您只在启动项目中编写所有对象图。