尽管这个问题似乎有点奇怪。我仍然在碰巧加入一个新项目中徘徊。
该项目大量使用温莎城堡IoC。在初始化之后检查容器,这告诉我某些实现已注册为LifeStyle.Transient
,而其他实现则已注册LifeStyle.Singleton
。他们的自定义引导代码搜索程序集并进行基于约定的注册,但没有提及Lifestyle。那么注册成分在生活方式上有何不同?
温莎城堡有一些神奇的命名约定吗?
例如:IFooManager
和FooManager
对将成为单身,而IFoo
和Foo
将成为暂时的生活方式。...(仅由于*经理)。
正如评论所要求的那样,这是对所有/以某种方式枚举的/程序集循环执行的核心注册:
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))));
答案 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]