假设我们有两个具有相同构造函数Injectable依赖关系的类:

public class FirstClass
{
    public FirstClass(ISomeDependency someDependency)
    { }
}

public class SecondClass
{
    public SecondClass(ISomeDependency someDependency)
    { }
}

现在我们有了ISomeDependency的注册:
builder.Register(x =>
        {
            string key = GetKeyFromCurrentHttpRequest();
            // if "Caller" is "FirstClass" return new Dependency(key);
            // else return new Dependency("defaultKey");
        }).As<ISomeDependency>();

注意:这是一个简化的用例。实际情况要复杂得多。

1.如何获取尝试解决ISomeDependency的“Caller”类型?

2.在这种情况下是否有更好的方法设计?

最佳答案

您可以使用委托(delegate)工厂来实现您的目标。唯一的缺点是FirstClassSecondClass不能使用ISomeDependency作为参数。

您可以在控制台应用程序中尝试此代码(只需添加Autofac依赖项)。

using System;
using Autofac;

namespace test
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            ContainerBuilder builder = new ContainerBuilder ();
            builder.RegisterType<SomeDependency>().As<ISomeDependency>();
            builder.RegisterType<FirstClass>();
            builder.RegisterType<SecondClass>();
            var container = builder.Build();

            var dummy = container.Resolve<FirstClass>();
            var dummy2 = container.Resolve<SecondClass>();
        }

        public interface ISomeDependency
        {
        }

        public class SomeDependency : ISomeDependency
        {
            public delegate ISomeDependency Factory(string value);
            private readonly string _value;

            public SomeDependency(string value)
            {
                _value = value;
                Console.WriteLine("Value = " + _value);
            }
        }

        public class FirstClass
        {
            private ISomeDependency _dependency;

            public FirstClass(SomeDependency.Factory factory)
            {
                _dependency = factory.Invoke("my value");
            }
        }

        public class SecondClass
        {
            private ISomeDependency _dependency;

            public SecondClass(SomeDependency.Factory factory)
            {
                _dependency = factory.Invoke("my value 2");
            }
        }
    }
}

10-06 08:41