【问题标题】:ASP .NET Core 3.1 IOC - Inject only some parameters, pass othersASP .NET Core 3.1 IOC - 仅注入一些参数,传递其他参数
【发布时间】:2020-03-12 17:16:57
【问题描述】:

我一直在寻找一种方式或模式,能够只将一些参数传递给一个类并注入其他参数。

想法是:

  • Param 是我传递给构造函数的参数
  • 注入是 IOC 必须处理的事情

调用类会像

new ClassToCreate(param, param, inject)

其中第三个参数是我不想传递的。

场景:

我将简要描述一下场景以及我是如何做到这一点的,所以也许有人有更聪明的解决方案

我正在开发一个与 SQL 数据库交互的项目,该项目具有工作单元和存储库模式。

工作单元类的一小部分摘录:

using Microsoft.Extensions.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace MYPROJECT.ILIKETHISPROJECT.Dependencies.Repositories
{
    public sealed class UnitOfWork : IUnitOfWork
    {
        public IDbConnection connection { get; set; }
        public IDbTransaction transaction { get; set; }
        private IRegistryRepository registryRepository;
        private IConfiguration configuration;

    private bool disposed;

    public UnitOfWork(IConfiguration configuration)
    {
        connection = new SqlConnection(configuration.GetConnectionString("DefaultConnection"));
        connection.Open();
        transaction = connection.BeginTransaction();
        this.configuration = configuration;
    }

    //Recovers data from a table called Registry
    public IRegistryRepository registry
    {
        get => registryRepository ?? new RegistryRepository(this, configuration, INJECT ME!!!, INJECT ME TOO!!!!);
        set => registryRepository = value;
    }

    public void Commit()
    {
        //DO COMMIT
    }

    public void Rollback()
    {
       // DO ROLLBACK
    }

    private void ResetRepositories()
    {
        registry = null;
    }

    public void Dispose()
    {
        //DO DISPOSE (IDisposable interface requires both dispose signatures)
    }

    private void Dispose(bool disposing)
    {
        //DO DISPOSE
    }

    ~UnitOfWork()
    {
        Dispose(false);
    }
  }
}

专注于

new RegistryRepository(this, configuration, INJECT ME!!!, INJECT ME TOO!!!!);

部分。在这里,我必须将工作单元和配置传递给存储库(因为我会获取一些参数。

现在,RegistryRepository 构造函数是:

public RegistryRepository(IUnitOfWork unitOfWork, IConfiguration configuration, IDataProtectionProvider dataProtectionProvider, DataProtectionPurposeStrings dataProtectionPurposeStrings)

自动注入的类是

  • IDataProtectionProvider dataProtectionProvider
  • DataProtectionPurposeStrings dataProtectionPurposeStrings

他们所做的是加密/解密一些字符串,我的目标是在 NET 的 appsettings.json 配置文件中存储和加密密码。核心 3.1 WebApi。

这个想法来自this Youtube video,它使用了net core中包含的数据保护。

基本上我需要传递前两个参数,我想让 IOC 处理其余的。

如果不可能,我将不得不以这种方式修改 UnitOfWork 构造函数:

public UnitOfWork(IConfiguration configuration, IDataProtectionProvider dataProtectionProvider, DataProtectionPurposeStrings dataProtectionPurposeStrings)

然后将两个实例化的类传递给RegistryRepository。

有没有更好的方法/想法来做到这一点?

【问题讨论】:

    标签: c# asp.net-core inversion-of-control


    【解决方案1】:

    您可以使用ActivatorUtilities.CreateInstance

    //...
    
    get => registryRepository ?? ActivatorUtilities.CreateInstance<RegistryRepository>(
        serviceProvider, this, configuration);
    
    //...
    

    但您将需要一个注入的服务提供者,该服务提供者将充当 IoC 容器来解析未提供的其他参数。

    不过,我建议重新考虑您当前关于注入 IConfiguration 的设计以及与 SqlConnection 等具体实现问题的紧密耦合。

    目前的设计似乎高度依赖运行时数据。

    【讨论】:

    • 你能扩展一下吗?我的意思是,如何使用 Activator + IServiceProvider (找不到示例)以及如何重新设计代码?这不是很清楚,谢谢
    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多