2

我想为不同类型的服务选择不同的记录器。在我下面的类方案中,我想使用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它必须选择记录仪与数据库的能力和的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>(); 

回答

0

我没有结构图的专家,并有可能在结构上的地图使用命名实例的方式,但我认为你可以只创建一个你想要做的日志记录的类型的子类,注入这些子类到构造函数:

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


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

经过一些研究似乎结构图可能会提供你想要什么,看this questionthe docs,你也可以达到你想要的东西通过注入abstract factory创建记录器,而不是记录仪本身。