gpt4 book ai didi

c# - CaSTLe 依赖注入(inject) 生活方式

转载 作者:太空宇宙 更新时间:2023-11-03 16:33:58 24 4
gpt4 key购买 nike

我应该指出,我对 CaSTLe 还比较陌生,所以还不知道我在用它做什么。要点是,我正在尝试使用 CaSTLe Windsor 创建对象的自定义生命周期。我不完全确定应该如何做到这一点,但是,我可以找到最接近它应该如何工作的近似值,我在下面详细说明了这一点。

我想要一个单例,但我不能释放这个类型并为其分配一个新实例。

即,

public interface IMyObject { string text; }

public class MyObject() : IMyObject {
public string text;
}

var container = new WindsorContainer();
container.Register(Component.For<IMyObject>().ImplementedBy<MyObject>().LifeStyle.Singleton);

MyObject item = SomeMethodGetInstance(); //Defines scope for instance 1
item = container.Resolve<IMyObject>(item);
Print(item);

>>instance 1
....

item = container.Resolve<IMyObject>(); //gets instance 1
Print(item);
>>instance 1
....

item = SomeMethodGetInstance() //New scope defined, now using instance 2

我希望能够释放实例,但 Windsors 对单例的定义对我的需求来说过于严格。

container.Release(item);    //I need to release the current instance, this doesn't work.

container.Kernal.ReleaseComponent(item);  //Don't work either.

因此,当我将一个新项目设置为当前项目时,它不会恢复到实例 1。

item = container.Resolve<IMyObject>(item);  //sets the currect instance of MyObject
Print(item);

>>instance 2

我需要存储一个具有自定义范围的变量,Singleton 或 Transient 都不适合我。当存储的变量进入和超出范围时,我需要能够定义范围。

更重要的是,如果我有另一个类 B,它依赖于 A,那么如果我从容器外部获取 A,我该如何在容器中设置 A?这在单例场景中很好,但我不能为 transient 场景设置它,但是,对于单例,一旦设置,我就无法释放它,这是必要的。

请问我该怎么做?

我想在代码中而不是在 xml 中执行此操作,因为我正在动态注册类。

最佳答案

您可以将您的组件注册为单个组件,如下所示

public void Register(string name, Type service, Type impl)
{
WindsorContainer container = new WindsorContainer();
IKernel kernel = container.Kernel;
kernel.AddComponent(name, service, impl, LifestyleType.Singleton);
}

您可以按如下方式释放组件

kernel.ReleaseComponent(yourResolvedSingletonInstance)

关于c# - CaSTLe 依赖注入(inject) 生活方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9816597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com