我应该指出的是,我对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我希望能够释放实例,但是Windsor对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我需要存储一个有自定义作用域的变量,无论是单例还是瞬态都不能帮我解决这个问题。我需要能够定义存储变量进出作用域时的作用域。
更重要的是,如果我有另一个类B,它依赖于A,那么如果我从容器外部获得A,我如何在容器中设置A?这在单例场景中很好,但我不能将其设置为瞬态场景,然而,对于单例场景,一旦设置了它,我就无法释放它,这是必要的。
我该怎么做呢?
我想用代码而不是xml来做这件事,因为我是动态注册类的。
发布于 2012-03-22 14:26:17
您可以将您的组件注册为单个组件,如下所示
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)发布于 2012-03-22 22:05:49
,我想要一个单件的
Castle Windsor的默认生活方式是singleton。
,但我不能释放此类型并将新实例分配给。
但那就不是单例了。
我该怎么做呢?
您没有确切地指定您想要做什么。您是否希望每次调用Resolve时都有一个新实例?那是LifeStyle.Transient。
发布于 2012-03-22 23:15:22
您是否考虑过使用定制工厂来生产您的实例?它可以在任何需要的时候调用DI框架来生成一个新的实例,但您可以定义自己的逻辑来确定何时需要释放旧的实例。
这种方法也回答了你的第二个问题。类B不应将A作为依赖项,而应将其作为AFactory。因为B可能比A寿命更长,所以它每次使用A时都需要向工厂询问它的“当前”实例。
https://stackoverflow.com/questions/9816597
复制相似问题