【问题标题】:Dependency Injection With Generic Repository使用通用存储库进行依赖注入
【发布时间】:2017-06-12 13:28:28
【问题描述】:

我正在尝试在我的 web api 控制器中进行依赖注入 (ASP.NET CORE),但我遇到了问题,因为有一个带有工作单元的通用存储库,还有一个通用服务层。这些服务位于不同的类库中。存储库也是如此。

我正在显示我的代码:

    public class AccountController : Controller
   {
     private IAccountService _accountService;

   public AccountController(IAccountService accountService)
    {
        _accountService = accountService;
    }
   }

服务层(基础服务):

  public class BaseService<TEntity> : IDisposable, IBaseService<TEntity> where TEntity : class
{
    private readonly IBaseRepository<TEntity> _repository;
    private readonly IUnitOfWork _unitOfWork;

    public BaseService(IBaseRepository<TEntity> repository, IUnitOfWork unitOfWork)
    {
        _repository = repository;
        _unitOfWork = unitOfWork;
    }

账户服务:

public class AccountService : BaseService<User>, IAccountService
{
    private readonly IAccountRepository _repository;
    private readonly IUnitOfWork _unitOfWork;

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

基础存储库:

  public class BaseRepository<TEntity> : IDisposable, IBaseRepository<TEntity> where TEntity : class
{
    protected NeoSpaceDbContext _database;

    public BaseRepository(NeoSpaceDbContext database)
    {
        _database = database;
    }

帐户存储库:

public class AccountRepository : BaseRepository<User>, IAccountRepository
{
    public AccountRepository(NeoSpaceDbContext context) : base(context)
    {} 
}

我认为我的问题是我的 web api 中的启动配置。

我已经试过了:

 services.AddScoped(typeof(IBaseService<User>), typeof(AccountService));

和:

        services.AddScoped(typeof(IBaseService<>), typeof(BaseService<>));
        services.AddSingleton<IAccountService, AccountService>();

但没有任何效果... 谁能告诉我什么是适合我的情况的配置?

【问题讨论】:

  • 你能添加一个标签来描述你正在使用的 DI 框架吗?
  • 刚看到这个教程:docs.microsoft.com/en-us/aspnet/core/fundamentals/…我不知道他们用的是什么框架@StriplingWarrior
  • 来自链接的文章,“ASP.NET Core 包含一个简单的内置容器(由 IServiceProvider 接口表示),默认支持构造函数注入,并且 ASP.NET 通过 DI 使某些服务可用。 "我猜这个“简单的内置容器”不够复杂,无法处理您尝试配置的那种通用绑定。考虑使用功能更全面的 DI 容器。 SimpleInjector 和 Ninject 是流行的选项。 Unity 由 Microsoft 提供支持。
  • 你的界面是什么样的。它们只是空的吗?
  • @Patrick Mcvay 在这个例子中是空的,但他们有特定的存储库方法

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


【解决方案1】:

我猜你不需要

services.AddScoped(typeof(IBaseService<>), typeof(BaseService<>));

因为IAccountService 应该实现IBaseService&lt;&gt; AccountService 应该实现BaseService&lt;&gt;。所以你不需要解析IBaseService

services.AddScoped<IAccountService, AccountService>();

应该有效

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2015-09-26
    • 2014-01-19
    • 2014-03-25
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多