Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态解析依赖项时共享作用域_C#_Dependency Injection_Inversion Of Control_Castle Windsor - Fatal编程技术网

C# 动态解析依赖项时共享作用域

C# 动态解析依赖项时共享作用域,c#,dependency-injection,inversion-of-control,castle-windsor,C#,Dependency Injection,Inversion Of Control,Castle Windsor,我遇到过这样一种情况:类(Parent)具有依赖项(IScopedInstance),并且还动态地解析方法中的其他接口(IOtherDependency)。该接口(依赖关系)的实现与原始类具有相同的依赖关系。我希望该实例的作用域为Parent的实例,即:我希望在Parent和Dependency内部有相同的实例,但前提是从Parent内部解决依赖关系,我使用Castle.Windsor作为DI容器 public class Parent : IParent { public Parent

我遇到过这样一种情况:类(
Parent
)具有依赖项(
IScopedInstance
),并且还动态地解析方法中的其他接口(
IOtherDependency
)。该接口(
依赖关系
)的实现与原始类具有相同的依赖关系。我希望该实例的作用域为
Parent
的实例,即:我希望在
Parent
Dependency
内部有相同的实例,但前提是从
Parent
内部解决依赖关系,我使用Castle.Windsor作为DI容器

public class Parent : IParent
{
    public Parent(IScopedInstance instance)
    {

    }

    public void DoSomething()
    {
        var anotherDependency = container.Resolve<IOtherDependency>();
    }
}

public class Dependency : IOtherDependency
{
    public Dependency(IScopedInstance instance)
    {
    }
}
但是可以理解的是,当从方法内部解析它时,它不起作用,因为依赖关系图中没有
IParent
(这是一个新的图)

真正的用例有点不同,我没有直接解决方法内部的
IOtherDependency
,但是我删除了所有不需要的额外信息


你知道怎么做吗?

首先,你应该在方法中创建一个工厂,很可能是一个类型化工厂,以便从容器中获取一个实例。
我想一个范围化的生活方式应该适合你的需要,或者如果你的代码是在web应用程序中运行的,那么一个perwebrequest的生活方式。

@ChristianoDegiorgis是对的。您应该向注册一个工厂方法或工厂,以解决依赖关系并将它们推送到构造函数中。实现的另一个缺点是类知道容器,并且依赖于容器及其程序集。是否有任何障碍阻止您通过工厂使用构造函数注入?正如我所说的,我不会直接解决依赖关系,但我是通过工厂来解决的,这在这里并不重要。我有一个限定范围的生活方式(见我的最后一段代码),就是在方法内部我需要一个动态调度。我使用的是一个通用接口,可以在多个地方重用。范围界定的问题是有两个单独的图,因此第二个图无法访问第一个图的范围
container.Register(Component
            .For<IScopedInstance>()
            .ImplementedBy<ScopedInstance>()
            .LifestyleBoundTo(x => x.First(xx => 
                xx.ComponentModel.Implementation.InheritsOrImplements(typeof(IParent)))));