城堡依赖注入生活方式

时间:2012-03-22 04:49:02

标签: c# .net dependency-injection castle-windsor

我应该指出,我对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中执行此操作,因为我正在动态注册类。

3 个答案:

答案 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}}的“当前”实例。