c# - Autofac 委托(delegate)工厂,并传递容器

标签 c# dependency-injection autofac

我有一个关于委托(delegate)工厂的问题:autofac docs

我了解他们是如何建立工厂的,但我不明白解决问题的部分:

var shareholdingFactory = container.Resolve<Shareholding.Factory>();
var shareholding = shareholdingFactory.Invoke("ABC", 1234);

看起来你必须绕过容器才能解析。也许我必须使用我只在运行时知道的参数调用一些东西。如果不将容器传递给服务方法,我该如何做到这一点?

更新

所以你应该改为通过工厂?

最佳答案

Autofac 可以自动解析工厂,即没有容器:

public class ShareHolding
{
    public ShareHolding(int accountId)
    {
        // do whatever you want
    }
}

public class MyApp
{
    private readonly ShareHolding _shareHolding;
    public MyApp(Func<int, ShareHolding> shareHoldingFactory)
    {
        _shareHolding = shareHoldingFactory(99);
    }

    public void Run()
    {
        // do whatever you want with the _shareHolding object
    }
}

Autofac 注册

var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<ShareHolding>(); // not a singleton
containerBuilder.RegisterType<MyApp>().SingeInstance();

var myApp = containerBuilder.Resolve<MyApp>();
myApp.Run();

现在,如果您的 ShareHolding 类型有这样的构造函数:

public class ShareHolding
{
    public delegate ShareHolding Factory(int accountId, int userId);
    public ShareHolding(int accountId, int userId)
    {
        // do whatever you want
    }
}

那么您将需要一个委托(delegate)工厂,因为 Autofac 使用类型信息解析构造函数,并使用参数名称解​​析委托(delegate)工厂。您的用法将变为:

public class MyApp
{
    public MyApp(ShareHolding.Factory shareHoldingFactory)
    {
        ....
    }
}

关于c# - Autofac 委托(delegate)工厂,并传递容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28165329/

相关文章:

java - 以编程方式设置特定的 bean 对象 - Spring DI

c# - 使用 Autofac 注册容器本身

c# - 使用 Android 设备在谷歌浏览器中打开 URL

java - Dagger 2 : Injecting member which has constructor parameters

c# - 将数字字符串拆分为数组

asp.net-mvc - 如何将基准测试记录到 MVC Controller 中的 CSV 文件?

c# - 如何在 Autofac 中为开放通用注册许多

c# - DependencyResolutionException 检测到循环组件依赖性 : How to use Autofac to inject decorator?

c# - 使用文本文件保存和加载 TextBox 或其他控件值

c# - 为什么我的 .NET 启动时间随着预生成的序列化程序集而增加?