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

时间:2019-01-15 14:59:56

标签: c# .net castle-windsor

尽管这个问题似乎有点奇怪。我仍然在碰巧加入一个新项目中徘徊。

该项目大量使用温莎城堡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))));

3 个答案:

答案 0 :(得分:2)

按要求回答您的问题(因为可以回答)-温莎城堡没有任何神奇的命名约定暗示生活方式。

答案 1 :(得分:1)

处理此问题的最佳方法是将您的注册划分为Installers,然后使用registration by convention以所需的配置显式注册某些组件组。

例如:

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

那样,它可以明确显示正在发生的事情。

答案 2 :(得分:0)

因此,我终于遇到一个解释行为的地方。

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

在我的情况下,原因是:

他们确实使用了Windsor Castle attributes这些可以分散到实现(组件)上的生活方式:

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

[Transient]