【问题标题】:Autofac. How to get caller class Type?自动法。如何获取调用者类类型?
【发布时间】:2015-03-29 00:42:33
【问题描述】:

假设我们有两个具有相同构造函数的类可注入依赖:

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。对于这种情况有没有更好的方法设计?

【问题讨论】:

    标签: dependency-injection inversion-of-control autofac ioc-container


    【解决方案1】:

    您可以使用委托工厂来实现您的目标。唯一的缺点是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");
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。这是个好的观点。实际上是当前的工作解决方案,但我想保持清洁并在配置中执行所有拾取逻辑。无论如何,这是一个好的开始。再次感谢。
    • 想象一下,在一次 Web 请求中,ISomeDependency 应该被注入两次。第一次来电者是Foo,第二次来电者是Bar。现在我有一个类型为 的字典。在此请求期间,根据调用者类型,I 拾取正确的 ISomeDependency 实例。也许需要一些 Lifetimescoping 工作?能给点建议吗?
    • Lifetimescope 用于在整个生命周期内提供相同的依赖项(此处为您的 Web 请求)。请为您的示例提供一些代码。
    猜你喜欢
    • 2013-11-09
    • 2019-10-15
    • 2015-12-19
    • 2013-04-24
    • 1970-01-01
    • 2012-07-03
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多