通过改变不同的构造函数类型来选择特定类型的结构映射配置

本文关键字:类型 结构 映射 配置 选择 构造函数 改变 | 更新日期: 2023-09-27 18:26:57

我正试图为不同类型的服务选择不同的记录器。在下面的类场景中,我想将DbAppender用于需要登录到db的服务,将FileAppender用作需要登录到文件的服务。

这是我的课堂设计:

public interface ILogger
{
}
public class Logger : ILogger
{
    private readonly IAppender _appender;
    public Logger(IAppender appender)
    {
        _appender = appender;
    }
}
public interface IAppender
{
}
public interface IRepository
{
}
public class DbAppender : IAppender
{
    private IRepository _repository;
    public DbAppender(IRepository repository)
    {
        _repository = repository;
    }
}
public class FileAppender : IAppender
{
}
public interface IHelloDbService
{
}
public class HelloServiceWithDbLog : IHelloDbService
{
    private readonly ILogger _logger;
    public HelloServiceWithDbLog(ILogger logger)
    {
        _logger = logger;
    }
}
public interface IHelloFileService
{
}
public class HelloServiceWithFileLog : IHelloFileService
{
    private readonly ILogger _logger;
    public HelloServiceWithFileLog(ILogger logger)
    {
        _logger = logger;
    }
}

现在,我必须相应地配置structureMap依赖项注入,以便对于DbService,它必须选择具有db功能的记录器,而对于FileService,它不得不选择具有文件功能的记录器。

    // this has to configure to choose Logger with FileAppender.
    x.For<IHelloFileService>().Use<HelloServiceWithFileLog>();
                .Ctor<ILogger>().Is<Logger>();
    // this has to configure to choose logger passing DbAppender.
             x.For<IHelloDbService>().Use<HelloServiceWithDbLog>();
                .Ctor<ILogger>().Is<Logger>();

通过改变不同的构造函数类型来选择特定类型的结构映射配置

我不是结构图专家,可能有一种方法可以在结构图中使用命名实例,但我认为你可以为你想要做的日志类型创建子类,并将这些子类注入构造函数:

public class DbLogger : Logger
{
    public DbLogger (DbAppender appender) : base(appender)
    {        
    }
}

x.For<IHelloDbService>().Use<HelloServiceWithDbLog>();
                .Ctor<ILogger>().Is<DbLogger>();

经过一些研究,结构图似乎可以提供你想要的东西,看看这个问题和文档,你也可以通过注入一个抽象工厂来创建记录器,而不是记录器本身来实现你想要的。