简单注入器-使用一个自定义参数注册服务

liv*_*ve2 5 c# dependency-injection ioc-container simple-injector

我尝试使用自定义参数“服务器”注册通信服务。但我想自动解决ILogger依赖关系,而不要两次设置此依赖关系。

最好的方法是什么?

SimpleInjector寄存器

var diContainer = new Container();
diContainer.Register<ILogger, DefaultLogger>();
//Good
diContainer.Register<ICommunicationService>(
    () => new CommunicationService("server1"), 
    Lifestyle.Singleton);
//Bad
diContainer.Register<ICommunicationService>(
    () => new CommunicationService(new DefaultLogger(), "server1"),
    Lifestyle.Singleton);
Run Code Online (Sandbox Code Playgroud)

CommunicationService类别

public class CommunicationService : ICommunicationService
{
    public CommunicationService(ILogger logger, string server)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

更新2017-11-27

@Steven我要运行两个CommunicationService具有不同配置的实例。在我的示例中server1和server2。

var container = new Container();
container.Register<ILogger, DefaultLogger>();
container.RegisterSingleton(new CommunicationServiceConfig { Server = "server1" });
container.RegisterSingleton(new CommunicationServiceConfig { Server = "server2" });

diContainer.Register<ICommunicationService, CommunicationService>(Lifestyle.Singleton);
diContainer.Register<ICommunicationService, CommunicationService>(Lifestyle.Singleton);
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 4

原始类型的注入对于 DI 容器来说始终是一个麻烦的领域,因为诸如string int和 之类的原始类型bool会导致歧义。

因此,最简单的解决方案是将这个string配置值包装到它自己的配置类中,例如:

public class CommunicationServiceConfig
{
    public string Server { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

让我们CommunicationService依赖CommunicationServiceConfig而不是string

public class CommunicationService : ICommunicationService
{
    public CommunicationService(ILogger logger, CommunicationServiceConfig config)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

通过此更改,组合根变为:

var container = new Container();
container.Register<ILogger, DefaultLogger>();
container.RegisterSingleton(new CommunicationServiceConfig { Server = "server1" });

diContainer.Register<ICommunicationService, CommunicationService>(Lifestyle.Singleton);
Run Code Online (Sandbox Code Playgroud)