繁体   English   中英

如果构造函数采用另一个接口,如何在Simple Injector中进行构造函数注入?

[英]How to do constructor injection in Simple Injector if constructor takes another interface?

我试图实例化HomedataAccess类,该类将字符串和接口IQueryManager作为构造函数参数。 我该如何注册?

到现在为止,我已经完成了以下工作,并且可以正常工作,但是我不喜欢这种方式:

 Kernel.Register(() => new HomeDataAccess("anandv4", 
     new SqlServerQueryManager(new SqlServerConnectionManager())));

还有另一种方法吗?

您正在做的事情可以正常工作。 没有错。 特别是当SqlServerQueryManagerSqlServerConnectionManager仅在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM