Autofac 构造函数链接

本文关键字:链接 构造函数 Autofac | 更新日期: 2023-09-27 17:56:08

我将如何使用Autofac实现等效输出123 .

我已经看了以下内容,但我认为它不太符合我想要实现的目标。

http://docs.autofac.org/en/latest/advanced/adapters-decorators.html

也许有人可以启发我——这是装饰师吗?

using System;
namespace Prototypes.Decorator
{
    public class Program
    {
        static void Main()
        {
            new Class1(new Class2(new Class3(null))).Do();
            Console.ReadKey(true);
        }
    }
    public interface ICommand
    {
        void Do();
    }
    public abstract class BaseClass : ICommand
    {
        private readonly ICommand _command;
        protected BaseClass(ICommand command)
        {
            _command = command;
        }
        public abstract void Do();
        public void CallNext()
        {
            if (_command != null)
            {
                _command.Do();
            }
        }
    }
    public class Class1 : BaseClass
    {
        public Class1(ICommand command) : base(command)
        {
        }
        public override void Do()
        {
            Console.Write(1);
            CallNext();
        }
    }
    public class Class2 : BaseClass
    {
        public Class2(ICommand command) : base(command)
        {
        }
        public override void Do()
        {
            Console.Write(2);
            CallNext();
        }
    }
    public class Class3 : BaseClass
    {
        public Class3(ICommand command) : base(command)
        {
        }
        public override void Do()
        {
            Console.Write(3);
            CallNext();
        }
    }
}

对于奖励积分,如果基构造函数上有另一个接口怎么办。像protected BaseClass(ICommand command, ILog log) { ... }这样合理的东西

Autofac 构造函数链接

几种方法可以构建容器 为了实现您的需求,您可以使用键控服务或 lambda。

Lambda 往往比使用字符串更不容易出错,所以这里有一个简单的容器注册,可以满足您的需求:

ContainerBuilder cbLambdas = new ContainerBuilder();
cbLambdas.Register<Class3>(ctx => new Class3(null));
cbLambdas.Register<Class2>(ctx => new Class2(ctx.Resolve<Class3>()));
cbLambdas.Register<Class1>(ctx => new Class1(ctx.Resolve<Class2>()));
IContainer containerLambda = cbLambdas.Build();
containerLambda.Resolve<Class1>().Do();

在添加 ILog 接口的情况下,按照以下声明:

public interface ILog
{
    void Log();
}
public class NullLog : ILog
{
    public void Log() { }
}

并将其添加为依赖项(在这种情况下仅适用于 Class2)

public class Class1 : BaseClass
{
    private readonly ILog logger;
    public Class1(ICommand command, ILog logger)
        : base(command)
    {
        this.logger = logger;
    }
    public override void Do()
    {
        Console.Write(1);
        CallNext();
    }
}

然后您的注册将变为:

ContainerBuilder cbWithLog = new ContainerBuilder();
cbWithLog.RegisterType<NullLog>().As<ILog>();
cbWithLog.Register<Class3>(ctx => new Class3(null));
cbWithLog.Register<Class2>(ctx => new Class2(ctx.Resolve<Class3>()));
cbWithLog.Register<Class1>(ctx => new Class1(ctx.Resolve<Class2>(), ctx.Resolve<ILog>()));
IContainer containerLog = cbWithLog.Build();
containerLog.Resolve<Class1>().Do();