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
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);
//...