gpt4 book ai didi

c# - 通过改变不同的构造函数类型来选择特定类型的结构图配置

转载 作者:太空宇宙 更新时间:2023-11-03 15:49:45 24 4
gpt4 key购买 nike

我正在尝试为不同类型的服务选择不同的记录器。在我接下来的类(class)场景中,我想将 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 依赖注入(inject),这样对于 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>();

最佳答案

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

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


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

经过一些研究,结构图似乎可以提供您想要的,请参阅 this questionthe docs你也可以通过注入(inject) abstract factory 来实现你想要的创建记录器而不是记录器本身。

关于c# - 通过改变不同的构造函数类型来选择特定类型的结构图配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26411183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com