首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Castle依赖注入生活方式

Castle依赖注入生活方式
EN

Stack Overflow用户
提问于 2012-03-22 12:49:02
回答 3查看 2.2K关注 0票数 2

我应该指出的是,我对Castle比较陌生,所以还不知道我在用它做什么。要点是,我正在尝试使用Castle Windsor创建一个对象的自定义生命周期。我不完全确定应该如何做到这一点,然而,我能找到的最接近它的工作方式,我已经在下面详细介绍过了。

我想要一个单例,但我不能释放此类型并将新实例分配给。

也就是说,

代码语言:javascript
复制
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的定义太严格了,不能满足我的需求。

代码语言:javascript
复制
container.Release(item);    //I need to release the current instance, this doesn't work.

代码语言:javascript
复制
container.Kernal.ReleaseComponent(item);  //Don't work either.

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

代码语言:javascript
复制
item = container.Resolve<IMyObject>(item);  //sets the currect instance of MyObject
Print(item); 

>>instance 2

我需要存储一个有自定义作用域的变量,无论是单例还是瞬态都不能帮我解决这个问题。我需要能够定义存储变量进出作用域时的作用域。

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

我该怎么做呢?

我想用代码而不是xml来做这件事,因为我是动态注册类的。

EN

回答 3

Stack Overflow用户

发布于 2012-03-22 14:26:17

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

代码语言:javascript
复制
public void Register(string name, Type service, Type impl)
{
   WindsorContainer container = new WindsorContainer();
   IKernel kernel = container.Kernel;
   kernel.AddComponent(name, service, impl, LifestyleType.Singleton);
}

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

代码语言:javascript
复制
kernel.ReleaseComponent(yourResolvedSingletonInstance)
票数 0
EN

Stack Overflow用户

发布于 2012-03-22 22:05:49

,我想要一个单件的

Castle Windsor的默认生活方式是singleton。

,但我不能释放此类型并将新实例分配给。

但那就不是单例了。

我该怎么做呢?

您没有确切地指定您想要做什么。您是否希望每次调用Resolve时都有一个新实例?那是LifeStyle.Transient

票数 0
EN

Stack Overflow用户

发布于 2012-03-22 23:15:22

您是否考虑过使用定制工厂来生产您的实例?它可以在任何需要的时候调用DI框架来生成一个新的实例,但您可以定义自己的逻辑来确定何时需要释放旧的实例。

这种方法也回答了你的第二个问题。类B不应将A作为依赖项,而应将其作为AFactory。因为B可能比A寿命更长,所以它每次使用A时都需要向工厂询问它的“当前”实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9816597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档