C# Castle未使用TypedFactory解析子依赖项

C# Castle未使用TypedFactory解析子依赖项,c#,dependency-injection,castle-windsor,C#,Dependency Injection,Castle Windsor,我有一个接口用于使用Castle的TypedFactoryFacility的工厂,该工厂使用字符串 public interface IFoo<T> {} public interface IBar1 : IFoo<IBar1> {} public interface IBar2 : IFoo<IBar2> {} public class MyClass1 : IBar1 {} public class MyClass2 : IBar2 {} public

我有一个接口用于使用Castle的TypedFactoryFacility的工厂,该工厂使用字符串

public interface IFoo<T> {}
public interface IBar1 : IFoo<IBar1> {}
public interface IBar2 : IFoo<IBar2> {}

public class MyClass1 : IBar1 {}
public class MyClass2 : IBar2 {}

public interface IFactory<T> where T : IFoo<T>
{
    T Create(string primitive2);
}
我希望基于IFoo在给定的名称空间中安装所有MyClass,但我希望IBar接口请求并解析实例。因此,两个接口都必须注册并解析为同一类的同一实例

以下是我的安装程序代码:

// register foo
container.Register(
    Classes.FromAssemblyContaining(typeof(IFoo<>))
        .InSameNamespaceAs(typeof(IFoo<>))
        .WithServiceAllInterfaces()
        .LifeStyleHybridPerWebRequestTransient());

// register factory
container.Register(
    Component.For(typeof(IFactory<>)).AsFactory()
        .LifeStyle.HybridPerWebRequestTransient());

// register sub dependency
container.Register(
    Component.For<ISubDependency>().ImplementedBy<SubDependency>()
        .LifeStyle.HybridPerWebRequestTransient()
        .DependsOn(new
        {
            primitive1 = "this resolves"
        }));

我让它工作起来了,虽然这看起来像是一个可怕的黑客,所以如果能得到一些指导就太好了

我将IFoo注册更改为:

container.Register(
    Classes.FromAssemblyContaining(typeof(IFoo<>))
        .InSameNamespaceAs(typeof(IFoo<>))
        .WithServiceAllInterfaces()
        .LifeStyleHybridPerWebRequestTransient()
        .Configure(r => r.DynamicParameters((k, d) =>
        {
            var subDependency = k.Resolve<ISubDependency>(d);
            d.Add("subDepedency", subDependency); 
        })));
container.Register(
类.FromAssemblyContaining(typeof(IFoo))
.InSameNamespaceAs(类型(IFoo))
.WithServiceAllInterfaces()
.Lifestyle HybridPerWebRequestTransient()
.Configure(r=>r.DynamicParameters)((k,d)=>
{
var子相关性=k.Resolve(d);
d、 添加(“子依赖项”,子依赖项);
})));
这很有效,但我不喜欢,我希望有更好的方法。这要求所有具有子依赖项作为依赖项的类都将其命名为“子依赖项”,例如:

public class MyClass1 : IBar1
{
    public MyClass1(SubDependency subDependency) // <-- MUST be named that.
}
公共类MyClass1:IBar1
{

public MyClass1(SubDependency SubDependency)/我让它开始工作了,尽管它看起来像是一个可怕的黑客,所以如果能得到一些指导就太好了

我将IFoo注册更改为:

container.Register(
    Classes.FromAssemblyContaining(typeof(IFoo<>))
        .InSameNamespaceAs(typeof(IFoo<>))
        .WithServiceAllInterfaces()
        .LifeStyleHybridPerWebRequestTransient()
        .Configure(r => r.DynamicParameters((k, d) =>
        {
            var subDependency = k.Resolve<ISubDependency>(d);
            d.Add("subDepedency", subDependency); 
        })));
container.Register(
类.FromAssemblyContaining(typeof(IFoo))
.InSameNamespaceAs(类型(IFoo))
.WithServiceAllInterfaces()
.Lifestyle HybridPerWebRequestTransient()
.Configure(r=>r.DynamicParameters)((k,d)=>
{
var子相关性=k.Resolve(d);
d、 添加(“子依赖项”,子依赖项);
})));
这是可行的,但我不喜欢,我希望有更好的方法。这要求所有具有子依赖项作为依赖项的类都将其命名为“子依赖项”,例如:

public class MyClass1 : IBar1
{
    public MyClass1(SubDependency subDependency) // <-- MUST be named that.
}
公共类MyClass1:IBar1
{

public MyClass1(SubDependency SubDependency)//即使这个答案有效,我还是决定走另一条路,并可能最终创建一个新问题。即使这个答案有效,我也决定走另一条路,并可能最终创建一个新问题。
public class MyClass1 : IBar1
{
    public MyClass1(SubDependency subDependency) // <-- MUST be named that.
}