使用 Autofac 将基本实现的装饰器连接到派生实现

问题描述 投票:0回答:1

我有以下类层次结构,其中有一个基接口 (IBase) 及其基本实现,以及从基接口继承、扩展它并拥有自己的具体实现的派生接口 (IExtended)。

public interface IBase
{
    void Execute();
}

public abstract class BaseImplementation : IBase
{
    public virtual void Execute() {
        Console.WriteLine("BaseImplementation: Executing base functionality.");
    }
}

public interface IExtended1 : IBase
{
    void ExtendedFunctionality1();
}

public class ExtendedImplementation1 : BaseImplementation, IExtended1
{
    public void ExtendedFunctionality1()
    {
        Console.WriteLine("ExtendedImplementation1: Executing extended functionality 1.");
    }

    public override void Execute()
    {
        base.Execute();
        Console.WriteLine("ExtendedImplementation1: Overridden base execution.");
    }
}

public interface IExtended2 : IBase
{
    void ExtendedFunctionality2();
}

public class ExtendedImplementation2 : BaseImplementation, IExtended2
{
    public void ExtendedFunctionality2()
    {
        Console.WriteLine("ExtendedImplementation2: Executing extended functionality 2.");
    }

    public override void Execute()
    {
        base.Execute();
        Console.WriteLine("ExtendedImplementation2: Overridden base execution.");
    }
}

我想通过适用于基本接口及其所有实现的装饰器添加横切功能。装饰器将如下所示:

public class BaseDecorator : IBase
{
    private readonly IBase _inner;

    public BaseDecorator(IBase inner) {
        _inner = inner;
    }

    public void Execute() {
        Console.WriteLine("BaseDecorator: Before execution.");
        _inner.Execute();
        Console.WriteLine("BaseDecorator: After execution.");
    }
}

我希望扩展接口的使用者请求 IExtended 作为依赖项,并能够解析为由 BaseDecorator 装饰的具体实现。消费者是一个需要 IExtended 接口作为其构造函数中的依赖项的类。

另外,我不想为系统中添加的每个新 IExtendedX 的实现创建单独的装饰器。

是否可以使用 Autofac 进行此类 DI 绑定,或者我的设计在这里是错误的?

我使用 Autofac 尝试了各种 DI 绑定,但没有成功。我认为根本原因是Autofac解决的是组合场景中的服务,而不是继承中的服务。然而,我的问题必须有一个解决方案,因为这似乎是一个很常见的问题。

c# architecture autofac
1个回答
0
投票

依赖注入通常与基于继承的注入有着困难的关系。 在处理 IOC 容器时,保持组合通常会让您的生活显着改善。 对于您想要做的事情,使用像Interceptors这样的面向 AOP 的方法会更好。 这将允许您在函数之上分层功能(如装饰器),而不是面向 IOC 的方法,后者实际上是为了替换内部功能,而不是顶层。

© www.soinside.com 2019 - 2024. All rights reserved.