首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Castle Windsor是否有自动判断生活方式的命名约定?

Castle Windsor是否有自动判断生活方式的命名约定?
EN

Stack Overflow用户
提问于 2019-01-15 22:59:56
回答 3查看 114关注 0票数 0

尽管这个问题看起来有点奇怪。我还在纠结于我碰巧加入的一个新项目。

该项目大量使用Windsor Castle IoC。在初始化后检查容器告诉我,一些实现已经注册为LifeStyle.Transient,而其他实现则具有LifeStyle.Singleton。他们的自定义引导代码搜索程序集并进行基于约定的注册,但对生活方式只字不提。那么为什么注册的组件在生活方式上有所不同呢?

城堡温莎有什么神奇的命名约定吗?

例如:IFooManagerFooManager将成为一对独生子女,而IFooFoo将获得短暂的生活方式……(只是因为*Manager)。

正如注释所要求的,这是在所有/somehow枚举/程序集的循环中执行的核心注册:

代码语言:javascript
复制
                    var assembly = Assembly.LoadFrom(fileName);
                    container.Register(Classes.FromAssembly(assembly).Pick()
                        .If(t => TypeIsInNamespaces(includeNamespaces, t) && GetInterfacesOfType(t, includeNamespaces).Any())
                        .WithService.Select((t, baseT) => GetInterfacesOfType(t, includeNamespaces)).Configure(c => c.Named(GetName(c.Implementation))));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-15 23:58:00

回答你的问题(因为它是可以回答的)-不,城堡温莎的神奇命名惯例没有办法暗示生活方式。

票数 2
EN

Stack Overflow用户

发布于 2019-01-16 11:32:56

解决这个问题的最佳方法是将您的注册划分到Installers中,并使用registration by convention显式地将某些组件组注册到您想要的配置中。

例如:

代码语言:javascript
复制
container.Register(Classes.FromThisAssembly()
    .InSameNamespaceAs<FooManager>()
    .WithService.DefaultInterfaces()
    .LifestyleTransient());

这样就可以清楚地看到正在发生的事情。

票数 1
EN

Stack Overflow用户

发布于 2019-01-18 20:11:35

所以,我终于发现了一个可以解释这种行为的地方。

所以答案是:不,温莎城堡没有自动的生活方式推断逻辑。

在我的案例中,原因是:

他们确实使用这些可以在实现(组件)中传播的Windsor Castle attributes来声明他们的生活方式:

代码语言:javascript
复制
/// <summary>
/// Message Box factory.
/// </summary>
[Singleton]
public class MessageBoxFact : IMessageBoxFact
{

代码语言:javascript
复制
[Transient]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54201460

复制
相关文章

相似问题

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