【发布时间】:2014-04-20 22:52:41
【问题描述】:
我不知道最好的方法是使用相同的安装程序为不同的应用程序注册不同的生活方式。
我有一个使用 Castle Windsor IoC 的 Web 项目。有些事情的范围是使用 PerWebRequest 生活方式。这些类在各自项目中的安装程序中注册。
到目前为止一切都很好,但我正在考虑将一些东西移到 windowsService 来做一些预定的东西。此服务将解析与 Web 项目相同的域,但当类注册到 PerWebRequest 生活方式时会出现问题。我想将其更改为服务的范围,但保持它在 Web 应用程序中的状态。配置是在保存在相应程序集中的安装程序中完成的。
安装程序不知道哪个应用程序正在尝试注册,但根据安装程序是从 Web 应用程序还是 Windows 服务注册的,注册需要具有不同的生活方式。
现在我已经恢复到一个丑陋的黑客,直到我得到更好的解决方案。
private static bool scopeLifetime = false;
public static void SetScopedLifetime()
{
scopeLifetime = true;
}
public void Install(IWindsorContainer container, IConfigurationStore store)
{
var registrations = Classes.FromThisAssembly()
.WithService.DefaultInterfaces();
if (scopeLifetime)
{
container.Register(registrations.LifestyleScoped());
}
else
{
container.Register(registrations.LifestylePerWebRequest());
}
}
在安装人员不需要知道上下文的情况下,告诉温莎我想做什么的正确方法是什么?
【问题讨论】:
-
安装程序不能重复使用。让它们保持简单、简洁和专注。
-
但是什么是更好的解决方案,创建具有不同生活方式的安装程序副本(违反 DRY,并且通过不注册每个安装程序使程序集扫描更加困难),或者将安装程序移动到一个地方我们知道上下文(将内部细节的责任转移到另一个项目)?听起来都不太好。我是否错过了解决此问题的另一种方法?
-
干燥是一个规则。不是法律。并且安装程序应该在每个应用程序的根程序集中,这样扫描就不会成为问题
标签: c# castle-windsor