C# 从激活上下文获取构造函数参数

C# 从激活上下文获取构造函数参数,c#,ninject,C#,Ninject,假设我希望由ProxyFactory创建实例,我需要能够向该工厂传递构造函数参数列表 public class Foo : ViewModelBase { public Bar MyBar { get; private set; } [Inject] public Foo(Bar bar) { MyBar = bar; } } 这是我当前的模块,需要对其进行扩展,以便将依赖项传递给ProxyFactory,因为ninject将解析这些依

假设我希望由ProxyFactory创建实例,我需要能够向该工厂传递构造函数参数列表

public class Foo : ViewModelBase
{
    public Bar MyBar { get; private set; }

    [Inject]
    public Foo(Bar bar)
    {
        MyBar = bar;
    }
}
这是我当前的模块,需要对其进行扩展,以便将依赖项传递给ProxyFactory,因为ninject将解析这些依赖项

public class InjectionModuleForConstructorArgsTest : NinjectModule
{
    public override void Load()
    {
        ViewModelProxyFactory proxyFactory = new ViewModelProxyFactory();
        Bind<Foo>().ToMethod(
        ctx =>
        {
            return proxyFactory.CreateViewModelProxy<Foo>();
        });
    }
}
公共类注入模块forconstructorargstest:ninject模块
{
公共覆盖无效负载()
{
ViewModelProxyFactory proxyFactory=新的ViewModelProxyFactory();
Bind().ToMethod(
ctx=>
{
返回proxyFactory.CreateViewModelProxy();
});
}
}
基本上,我希望实现以下方面的自动化:

Bind<Foo>().ToMethod(
ctx =>
{
    return proxyFactory.CreateViewModelProxy<Foo>(Kernel.Get<Bar>());
});
Bind().ToMethod(
ctx=>
{
返回proxyFactory.CreateViewModelProxy(Kernel.Get());
});

你知道这是否可行吗

在这种情况下,我建议将
ViewModelProxyFactory
实现为
提供程序
,并将
注入

公共类ViewModelProxyFactory:提供程序
{
公共ViewModelProxyFactory(Bar){this.Bar=Bar;}
公共T CreateInstance(IContext ctx)
{
在此处返回您的FactoryCode
}
}
Bind().ToProvider();

答案要么是Ninject.Extensions.Factory,要么是解释为什么这不够好的编辑。实际上,这是一个我可以接受的解决方案(我已经使用过了),但我想了解一下ActivationContext,希望找到一种更通用的方法……我将查看您提到的Factory扩展(+1),谢谢Remo,听起来不错。我去试一试,过会儿再回来!现在我仔细看了一下,我不认为这是我需要的。ProxyFactory应该向抛出的任何类添加更改通知功能。这种工厂方法意味着我必须为我想要装饰的每个类创建一个工厂。我需要一个通用的方法。无论如何,谢谢你和+1为我指出这一点!在这种情况下,您应该更详细地解释您在该工厂中所做的工作。在该工厂中,我使用Castle生成一个
ClassProxy
,并添加一个拦截器,该拦截器在调用属性的setter时处理更改通知。我想添加对无参数构造函数的支持(Castle确实支持,我只需要把它们放到那里)看看拦截扩展。它增加了为任何类型创建此类代理的支持。
public class ViewModelProxyFactory<T> : Provider<T>
{
    public ViewModelProxyFactory(Bar bar) { this.bar = bar; }

    public T CreateInstance(IContext ctx)
    {
        return putYourFactoryCodeHere
    }
}

Bind<Foo>().ToProvider<ViewModelProxyFactory<Foo>>();