c# - CaSTLe Windsor 内联依赖项

标签 c# dependency-injection castle-windsor

我需要使用 caSTLe-windsor 的内联依赖特性。 我需要在依赖链中注入(inject)特定组件。 我有这样的情况。

static void Main(string[] args)
{
    var container = new Castle.Windsor.WindsorContainer();

    container.Register(
        Component.For<IHigherBusiness>()
                 .ImplementedBy<HigherBusiness>()
                 .DependsOn(Dependency.OnComponent<ILogger, FullDetailLogger>())
        );

    container.Register(Component.For<ISomeBusiness>()
                 .ImplementedBy<Business>());
    container.Register(Component.For<ILogger>()                         
                 .ImplementedBy<FullDetailLogger>().IsFallback());
    container.Register(Component.For<ILogger>()
                 .ImplementedBy<SimpleLogger>());

    var business = container.Resolve<IHigherBusiness>();
    business.DoSomething();

    var logger = container.Resolve<ILogger>();
    logger.Log("Some Log... ."); 
}

与业务...

public interface IHigherBusiness
{
    void DoSomething();
}

public class HigherBusiness : IHigherBusiness
{
    private ISomeBusiness someBusiness;

    public HigherBusiness(ISomeBusiness someBusiness)
    {
        this.someBusiness = someBusiness;
    }
    public void DoSomething()
    {
        someBusiness.DoSomething();
    }
}

public interface ISomeBusiness
{
    void DoSomething();
}

public class Business : ISomeBusiness
{
    private ILogger logger;
    public Business(ILogger logger)
    {
        this.logger = logger;
    }
    public void DoSomething()
    {
        logger.Log("Message");
    }
}

和记录器...

public interface ILogger
{
    void Log(string message);
}

public class SimpleLogger : ILogger
{

    public void Log(string message)
    {
        Console.WriteLine("Simple Logger: " + message);
    }
}

public class FullDetailLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine("Full detail Logger: " + message);
    }
}

结果是:

Simple Logger: Message
Simple Logger: Some Log... .

但我希望这样:

Full detail Logger: Message
Simple Logger: Some Log... .

我怎样才能做到这一点?

最佳答案

DependsOn 仅向下一级工作,因此您必须使 Business 依赖于特定的 ILogger

你可以这样做:

    static void Main(string[] args)
    {

        var container = new Castle.Windsor.WindsorContainer();

        container.Register(
                Component.For<IHigherBusiness>()
                .ImplementedBy<HigherBusiness>()
                .DependsOn(Dependency.OnComponent(typeof(ISomeBusiness),
                            "BusinessWithExtendedLogger"))
            );
        container.Register(Component.For<ISomeBusiness>().ImplementedBy<Business>()
                .DependsOn(Dependency.OnComponent<ILogger, FullDetailLogger>())
                .Named("BusinessWithExtendedLogger")
            );
        container.Register(Component.For<ISomeBusiness>().ImplementedBy<Business>()
                .DependsOn(Dependency.OnComponent<ILogger, SimpleLogger>())
                .IsDefault()
            );
        container.Register(Component.For<ILogger>().ImplementedBy<FullDetailLogger>()
                .IsFallback()
            );
        container.Register(Component.For<ILogger>().ImplementedBy<SimpleLogger>());

        var business = container.Resolve<IHigherBusiness>();
        business.DoSomething();

        var normalBusiness = container.Resolve<ISomeBusiness>();
        normalBusiness.DoSomething();

        var logger = container.Resolve<ILogger>();
        logger.Log("Some Log... .");
        Console.ReadKey();

    }

返回:

Full detail Logger: Message

Simple Logger: Message

Simple Logger: Some Log... .

只为 IHigherBussiness 提供 FullDetailLogger

关于c# - CaSTLe Windsor 内联依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35717276/

相关文章:

c# - CaSTLe Windsor 解析通用接口(interface)

caSTLe-windsor - 当 URI 未知时在容器中注册 WcfClient

c# - 使用 C# 中的 Windows API 设置主监视器

c# - 无法将 linq 结果隐式转换为 View 模型列表

c# - 将密码存储在内存中的风险有多大?

c# - 将 IServiceProvider 作为依赖项获取 ASP.NET Core 中的可选依赖项

c# - 如何从 .net 客户端发送多个(包括根 CA)证书

oop - 当创建的类也需要运行时值时进行依赖注入(inject)?

c# - 我似乎无法在 WinRT BackgroundTask 中使用依赖注入(inject)

c# - 在类库中实例化 CaSTLe Windsor 容器时的最佳实践是什么?