c# - Unity 与需要参数的工厂方法

标签 c# unity-container factory

我想使用需要参数的工厂方法在 Unity 容器中注册一个类型。这些参数将由统一解决,但仅限于运行时。

工厂方法代码:

public static IApp Create(IOne, ITwo) {...}

注册码:

container.RegisterType(typeof(IApp), new InjectionFactory(f => App.Create(???, ???)));

我需要什么来替换'???' ?

更多信息:

我的 Unity 配置分两个阶段进行。第一阶段(应用程序开始),我注册了我所有的对象,除了一个:

container.RegisterType<IOne, One>();
container.RegisterType<ITwo, Two>();
container.RegisterType<IApp, App>();
// ...

第二阶段(用户正在登录),我只是注册了一个上下文对象的实例,它在我所有类的构造函数中使用(OneTwo应用, ...) :

var childContainer = container.CreateChildContainer();
childContainer.RegisterInstance<AppEnvironment>(new AppEnvironment(userName));

这是我没有使用 InjectionFactory 的代码。它工作正常。现在,我必须多次注册我的 IApp 接口(interface),每次都调用不同的静态方法。静态方法示例:

public static IApp Create(IOne one, ITwo two, AppEnvironment env) 
{
    _one = one;
    _two = two;
    _env = env;
}

如果我注册 IApp 这个代码:

container.Register(typeof(IApp), new InjectionFactory(f => App.Create(container.Resolve<IOne>(), container.Resolve<ITwo>(), container.Resolve<AppEnvironment>()));

那我的环境变量没有设置。

但是如果我注册我的 env 实例(只是为了测试目的,我不能这样做),它会起作用。

最佳答案

终于找到解决办法了。看起来像 willys one :

container.RegisterType<IApp, App>(
    new InjectionFactory(
        f => App.Create(
            f.Resolve<IOne>(), 
            f.Resolve<ITwo>()
        )
    )
);

关于c# - Unity 与需要参数的工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43390927/

相关文章:

c# - 使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

asp.net-mvc - 用于依赖注入(inject)的 MVC Web API 和 Unity

c# - DbContext Unity 不调用 HttpContextLifetimeManager.RemoveValue() 坏事?

c# - 如何在 NET Core 中播放声音?

c# - 如何使用 .NET NEST 客户端在函数评分查询中创建过滤器

c# - 为什么依赖注入(inject)注入(inject)最后注册的对象?

javascript - Sencha touch 2 Ext.factory范围

c++ - 创建基于模板和 boost::shared_ptr 的通用工厂时出现编译错误

c# - 类实例创建限制

c# - 使用 Linq(EF 核心)仅选择特定字段