我有以下类层次结构,其中有一个基接口 (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解决的是组合场景中的服务,而不是继承中的服务。然而,我的问题必须有一个解决方案,因为这似乎是一个很常见的问题。
依赖注入通常与基于继承的注入有着困难的关系。 在处理 IOC 容器时,保持组合通常会让您的生活显着改善。 对于您想要做的事情,使用像Interceptors这样的面向 AOP 的方法会更好。 这将允许您在函数之上分层功能(如装饰器),而不是面向 IOC 的方法,后者实际上是为了替换内部功能,而不是顶层。