【发布时间】: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