我应该指出,我对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
我希望能够发布实例,但是Windrator对Singleton的定义过于严格,无法满足我的需求。
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?这在单例方案中很好,但我无法将其设置为瞬态场景,但是,使用Singleton,一旦设置,我就无法释放它,这是必要的。
我该怎么做?
我想在代码中而不是在xml中执行此操作,因为我正在动态注册类。
答案 0 :(得分:0)
您可以将您的组件注册为单个,如下所示
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)
答案 1 :(得分:0)
我想要一个单身人士
Castle Windsor 的默认生活方式是单身。
但我无法释放此类型并为其分配新实例。
但那不是单身人士。
我该怎么做?
您没有准确指定您想要做的事情。每次拨打Resolve
时,您想要一个新实例吗?那是LifeStyle.Transient
。
答案 2 :(得分:0)
您是否考虑过使用自定义工厂来制作实例?它可以在需要的时候调用DI框架来生成新实例,但是您可以定义自己的逻辑来确定何时需要释放旧实例。
这种方法也回答了你的第二个问题。类B
不应将A
作为依赖项,而应使用AFactory
。由于B
可能比A
更长,因此每次使用A
时都需要向工厂询问{{1}}的“当前”实例。