微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

依赖注入 – Autofac.如何获得调用者类类型?

假设我们有两个具有相同构造函数的类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.有没有更好的方法来设计这种情况?

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐