Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NETCore3.1IoC-只注入一些参数,传递其他参数_C#_Asp.net Core_Inversion Of Control - Fatal编程技术网

C# ASP.NETCore3.1IoC-只注入一些参数,传递其他参数

C# ASP.NETCore3.1IoC-只注入一些参数,传递其他参数,c#,asp.net-core,inversion-of-control,C#,Asp.net Core,Inversion Of Control,我正在寻找一种方法或模式,以便能够只将一些参数传递给类,并注入其他参数 想法是: Param是我传递给构造函数的参数 这是国际奥委会必须处理的事情 调用类就像 new ClassToCreate(param, param, inject) 其中第三个参数是我不想通过的 场景: 我将简要描述这个场景以及我是如何做到这一点的,因此也许有人有更聪明的解决方案 我正在从事一个与SQL数据库交互的项目,使用工作单元和存储库模式 工作等级单位的一小部分摘录: using Microsoft.Exten

我正在寻找一种方法或模式,以便能够只将一些参数传递给类,并注入其他参数

想法是:

  • Param是我传递给构造函数的参数
  • 这是国际奥委会必须处理的事情
调用类就像

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);
    }
  }
}
集中精力

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

现在,RegistryRepository结构是:

public RegistryRepository(IUnitOfWork unitOfWork, IConfiguration configuration, IDataProtectionProvider dataProtectionProvider, DataProtectionPurposeStrings dataProtectionPurposeStrings)
自动注入的类将是

  • IDataProtectionProvider数据保护提供程序
  • DataProtectionPurposeStrings DataProtectionPurposeStrings
他们所做的是加密/解密一些字符串,我的目标是在NET.CORE 3.1 WebApi的appsettings.json配置文件中存储并加密密码

这个想法来源于使用网络核心中包含的数据保护

基本上我需要通过前两个参数,我想让国际奥委会来处理剩下的

如果不可能,我将不得不这样修改UnitOfWork构造函数:

public UnitOfWork(IConfiguration configuration, IDataProtectionProvider dataProtectionProvider, DataProtectionPurposeStrings dataProtectionPurposeStrings)
然后将这两个实例化的类传递给RegistryRepository

有更好的方法/想法吗?

您可以使用

/。。。
get=>registryRepository??ActivatorUtilities.CreateInstance(
serviceProvider、此、配置);
//...
但是您将需要一个注入式服务提供者,它将充当IoC容器来解析未提供的其他参数

然而,我建议您重新考虑当前关于注入
IConfiguration
的设计,并与具体的实现问题紧密耦合,如
SqlConnection


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

您能详细介绍一下吗?我的意思是,如何使用Activator+IServiceProvider(找不到相关示例)以及如何重新设计代码?这还不是很清楚,谢谢
public UnitOfWork(IConfiguration configuration, IDataProtectionProvider dataProtectionProvider, DataProtectionPurposeStrings dataProtectionPurposeStrings)
//...

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

//...