与需要参数的工厂方法统一

Olo*_*lof 6 c# factory unity-container

我想用需要参数的工厂方法在Unity容器中注册一个类型。这些参数应统一解决,但只能在运行时解决。

工厂方法代码:

public static IApp Create(IOne, ITwo) {...}
Run Code Online (Sandbox Code Playgroud)

注册代码:

container.RegisterType(typeof(IApp), new InjectionFactory(f => App.Create(???, ???)));
Run Code Online (Sandbox Code Playgroud)

我需要什么来替换“ ???” ?

更多信息:

我的Unity配置分为两个阶段。第一阶段(应用程序正在启动),我注册了除一个对象之外的所有对象:

container.RegisterType<IOne, One>();
container.RegisterType<ITwo, Two>();
container.RegisterType<IApp, App>();
// ...
Run Code Online (Sandbox Code Playgroud)

第二阶段(用户登录),我中庸之道注册谁在我所有的类的构造函数中使用的上下文对象的实例(OneTwoApp,...):

var childContainer = container.CreateChildContainer();
childContainer.RegisterInstance<AppEnvironment>(new AppEnvironment(userName));
Run Code Online (Sandbox Code Playgroud)

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

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

如果我向IApp注册此代码:

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

然后没有设置我的env变量。

但是,如果我注册了我的env实例(仅出于测试目的,我不能这样做),它就可以工作。

Olo*_*lof 6

终于得到了解决方案。看起来像是威利斯:

container.RegisterType<IApp, App>(
    new InjectionFactory(
        f => App.Create(
            f.Resolve<IOne>(), 
            f.Resolve<ITwo>()
        )
    )
);
Run Code Online (Sandbox Code Playgroud)