![](/img/trans.png)
[英]Constructor injection with Quartz.NET 3.0.3 and Simple Injector How To
[英]How to do constructor injection in Simple Injector if constructor takes another interface?
我试图实例化HomedataAccess
类,该类将字符串和接口IQueryManager
作为构造函数参数。 我该如何注册?
到现在为止,我已经完成了以下工作,并且可以正常工作,但是我不喜欢这种方式:
Kernel.Register(() => new HomeDataAccess("anandv4",
new SqlServerQueryManager(new SqlServerConnectionManager())));
还有另一种方法吗?
您正在做的事情可以正常工作。 没有错。 特别是当SqlServerQueryManager
和SqlServerConnectionManager
仅在HomeDataAccess
类中使用时。
但是,如果在多个地方使用IQueryManager
抽象,则会变得更加成问题,因为这将导致注册重复,并且这可能会增加维护。
一个解决方案可能是执行以下操作:
Kernel.Register(() => new HomeDataAccess(
"anandv4",
Kernel.GetInstance<IQueryManager>());
但是,这样做的缺点是,在运行诊断程序时,这会使Simple Injector完全蒙蔽。 因此,不建议这样做。
有多种方法可以将 Simple Injector 扩展为,以便可以注册类似这些原始类型的依赖关系,但是通常,将原始值包装到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()));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.