我正在尝试实例化HomedataAccess
类,它接受字符串和接口IQueryManager
作为构造函数参数。我该如何注册?
直到现在我已经完成了以下操作并且它有效但我不喜欢这样:
Kernel.Register(() => new HomeDataAccess("anandv4",
new SqlServerQueryManager(new SqlServerConnectionManager())));
还有另一种方法吗?
答案 0 :(得分:1)
你正在做的事情可以正常工作。这没什么不对。特别是当SqlServerQueryManager
和SqlServerConnectionManager
仅在HomeDataAccess
班级中使用时。
但是,如果IQueryManager
抽象在多个地方使用,它会变得更有问题,因为它会导致注册重复,这可能会增加维护。
解决方案可能是执行以下操作:
Kernel.Register(() => new HomeDataAccess(
"anandv4",
Kernel.GetInstance<IQueryManager>());
然而,它的缺点是,当它运行诊断时,它会完全遮住Simple Injector。所以不建议这样做。
有一些方法to extend简单注入器,以便可以注册这些原始依赖项,但通常是将原始值包装到DTO中更容易的解决方案。例如:
public class HomeDataAccessConfig
{
public readonly string UserName;
public HomeDataAccessConfig (string userNamr) {
if (string.IsNullOrWhiteSpace(userName)) throw new ...
this.Usrrname = userName.
}
}
public class HomeDataAccess
{
private readonly HomeDataAccessConfig config;
private readonly IQueryManager manager;
public HomeDataAccess(HomeDataAccessConfig config, IQueryManager manager) {
this.config = config;
this.manager = manager;
}
}
这允许您按如下方式进行注册:
Kernel.RegisterSingleton(new HomeDataAccessConfig("anandv4"));
Kernel.Register<HomeDataAccess>();
Kernel.Register<IQueryManager>(() =>
new SqlServerQueryManager(new SqlServerConnectionManager()));