gpt4 book ai didi

c# - 使用相同的安装程序从不同的应用程序设置不同的 CaSTLe Windsor 生活方式

转载 作者:太空宇宙 更新时间:2023-11-03 13:26:01 27 4
gpt4 key购买 nike

我无法确定使用相同安装程序为不同应用程序注册不同生活方式的最佳方法。

我有一个使用 CaSTLe Windsor IoC 的网络项目。有些东西的范围是使用 PerWebRequest 生活方式。这些类已在各自项目中的安装程序中注册。

到目前为止一切都很好,但我正在考虑将一些东西移动到 windowsService 来做一些预定的事情。该服务将解析与 web 项目相同的域,但在使用 PerWebRequest 生活方式注册类时会遇到麻烦。我想将其更改为该服务的 Scoped,但保持它在 Web 应用程序中的原样。配置在保存在各自程序集中的安装程序中完成。

安装程序不知道哪个应用程序正在尝试注册,但注册需要具有不同的生活方式,具体取决于安装程序是从 Web 应用程序还是从 Windows 服务注册的。

现在我已经恢复到一个丑陋的 Hack,直到我得到更好的解决方案。

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

在安装程序不需要知道上下文的情况下告诉 windsor 我想做什么的正确方法是什么?

最佳答案

在对 caSTLe 框架进行更多练习之后,我想指出一个更好的方法来处理这个问题。有一个接口(interface)叫做 IContributeComponentModelConstruction这使您可以在注册后操作组件的配置。它在每次注册后使用,因此可用于在组件配置上广撒网。您的特定问题被清楚地描述了 in a blog post通过马克西曼

鉴于此安装程序:

public class FooInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container,
IConfigurationStore store)
{
container.Register(Component.For<IFoo>().ImplementedBy<Foo>().LifeStyle.Transient);
}
}

您可能想在另一个上下文中改变生活方式,因此创建一个 IContributeComponentModelConstruction 实例并将其添加到容器中

public class SingletonEqualizer :
IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel,
ComponentModel model)
{
model.LifestyleType = LifestyleType.Singleton;
}
}

/* --- */

var container = new WindsorContainer();
container.Kernel.ComponentModelBuilder
.AddContributor(new SingletonEqualizer()); // before the intaller is called
container.Install(new FooInstaller());

每个组件的生命周期都会改变;您还可以根据正在注册的组件优化行为。回想起来,我真的认为这是对您问题的最佳答案。

关于c# - 使用相同的安装程序从不同的应用程序设置不同的 CaSTLe Windsor 生活方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22425481/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com