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

时间:2017-03-02 17:38:58

标签: c# dependency-injection simple-injector

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

直到现在我已经完成了以下操作并且它有效但我不喜欢这样:

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

还有另一种方法吗?

1 个答案:

答案 0 :(得分:1)

你正在做的事情可以正常工作。这没什么不对。特别是当SqlServerQueryManagerSqlServerConnectionManager仅在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()));