通过改变不同的构造函数类型来选择特定类型的结构映射配置
本文关键字:类型 结构 映射 配置 选择 构造函数 改变 | 更新日期: 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>();
经过一些研究,结构图似乎可以提供你想要的东西,看看这个问题和文档,你也可以通过注入一个抽象工厂来创建记录器,而不是记录器本身来实现你想要的。