温莎城堡是否有自动判断生活方式的命名约定?

Does Castle Windsor have a naming convention to judge lifestyle automagically?

虽然这个问题看起来有点奇怪。我仍然在碰巧加入的新项目中摸索。

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

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

例如:IFooManagerFooManager 将成为单身人士,而 IFooFoo 将获得短暂的生活方式....(只是由于给*经理)。

正如评论所要求的那样,这是在所有/以某种方式枚举/程序集上循环执行的核心注册:

                    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))));

按要求回答您的问题(因为它可以回答)- 不,温莎城堡的神奇命名约定无法暗示生活方式。

处理该问题的最佳方法是将您的注册划分为 Installers and use registration by convention,以明确注册具有所需配置的某些组件组。

例如:

container.Register(Classes.FromThisAssembly()
    .InSameNamespaceAs<FooManager>()
    .WithService.DefaultInterfaces()
    .LifestyleTransient());

这样就可以清楚地知道发生了什么。

所以,我终于找到了一个解释行为的地方。

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

我的原因是:

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

/// <summary>
/// Message Box factory.
/// </summary>
[Singleton]
public class MessageBoxFact : IMessageBoxFact
{

[Transient]