尽管这个问题看起来有点奇怪。我还在纠结于我碰巧加入的一个新项目。
该项目大量使用Windsor Castle IoC。在初始化后检查容器告诉我,一些实现已经注册为LifeStyle.Transient,而其他实现则具有LifeStyle.Singleton。他们的自定义引导代码搜索程序集并进行基于约定的注册,但对生活方式只字不提。那么为什么注册的组件在生活方式上有所不同呢?
城堡温莎有什么神奇的命名约定吗?
例如:IFooManager和FooManager将成为一对独生子女,而IFoo和Foo将获得短暂的生活方式……(只是因为*Manager)。
正如注释所要求的,这是在所有/somehow枚举/程序集的循环中执行的核心注册:
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))));发布于 2019-01-15 23:58:00
回答你的问题(因为它是可以回答的)-不,城堡温莎的神奇命名惯例没有办法暗示生活方式。
发布于 2019-01-16 11:32:56
解决这个问题的最佳方法是将您的注册划分到Installers中,并使用registration by convention显式地将某些组件组注册到您想要的配置中。
例如:
container.Register(Classes.FromThisAssembly()
.InSameNamespaceAs<FooManager>()
.WithService.DefaultInterfaces()
.LifestyleTransient());这样就可以清楚地看到正在发生的事情。
发布于 2019-01-18 20:11:35
所以,我终于发现了一个可以解释这种行为的地方。
所以答案是:不,温莎城堡没有自动的生活方式推断逻辑。
在我的案例中,原因是:
他们确实使用这些可以在实现(组件)中传播的Windsor Castle attributes来声明他们的生活方式:
/// <summary>
/// Message Box factory.
/// </summary>
[Singleton]
public class MessageBoxFact : IMessageBoxFact
{或
[Transient]https://stackoverflow.com/questions/54201460
复制相似问题