【问题标题】:Windsor Castle Equivalent of Autofac's IStartable温莎城堡相当于 Autofac 的 IStartable
【发布时间】:2015-08-25 04:20:18
【问题描述】:

我希望能够在我的温莎城堡容器设置中实现这一点:

“对于在当前程序集中实现 IStartable 的所有类型,注册它们并为它们运行 Start 方法。”

类似于注册 Automapper 映射等使用 Autofac 所做的事情。例如

    public class MyBlahViewModelMapper : IStartable
{
    public void Start()
    {
        Mapper.CreateMap<MyBlahEntity, MyBlahViewModel>();
    }
}

Autofac 会自动执行....我认为 Windsor 在这里帮不了我?

【问题讨论】:

  • 我想我正在寻找一种方法来拆分我所有的 Automapper 定义.....我的环境使用 Windsor Castle 作为 IOC 容器。

标签: automapper castle-windsor autofac windsor-3.0


【解决方案1】:

Windsor 有自己的IStartable 接口。如果您希望 Windsor 注册您的对象并在之后立即创建/运行它们,您可以使用 Startable Facility

为了澄清,这里有两个概念:

  1. IStartable接口,提供StartStop方法。这是一个提供生命周期回调的生命周期接口:Start 在组件实例创建后(构造函数运行后)立即调用

  2. 可启动设施,它强制您的 IStartable 组件被实例化并在安装程序运行后立即启动。

代码如下所示:

container.AddFacility<StartableFacility>(f => f.DeferredStart());
container.Install(FromAssembly.This());
// by here all startable are started

如果您使用的是 Windsor 3.3 或更高版本,您还可以手动触发可启动项启动(如果您需要为它们进行一些额外设置,这很有用)

var flag = new StartFlag();

container.AddFacility<StartableFacility>(f => f.DeferredStart(flag));
container.Install(FromAssembly.This());
// do whatever else set up your app needs

// when ready, signal the flag
flag.Signal();
// by here all startable are started

【讨论】:

  • 这是为了解决组件的生命周期管理;我不认为它与 Autofact 接口的作用相同。
  • 不,不是。相信我,我写的。
  • 感谢@KrzysztofKozmic,因此 Startable Facility 将等同于 autofac 中的 IStartable 并允许我为 n 个实现公共接口的类运行“start”方法?
  • @user2864740 @andrewDuffy 我扩展了答案以澄清 IStartableStartableFacility 的用途
  • 我们有多个从 IWindsorInstaller 继承的安装程序,所以我不确定 DeferredStart 是我需要的吗?
【解决方案2】:

最接近的是Castle Windows Installers - 它们可以从程序集中轻松扫描并安装(或“启动”)。安装程序通常用于注册组件,但也可以用于其他初始化。

Windsor 使用安装程序(即实现 IWindsorInstaller 接口的类型)来封装和划分您的注册逻辑。FromAssembly [使] 使用安装程序变得轻而易举。

创建安装程序后,使用主 IoC 引导程序中的一种流畅配置,例如:

container.Install(
   FromAssembly.This());

注意顺序是未指定的;必须按顺序出现的安装程序必须使用明确的安装顺序指定,可能通过修改后的程序集反射器。

【讨论】:

  • 感谢您的输入....我正在使用安装程序...不确定他们将如何帮助我在实现特定接口的“n”类上调用 start 方法
  • @AndrewDuffy 使用 IWindsorInstaller 接口实现 n 类并实现 Install 方法。忘记它被称为“安装”而不是“开始”。如果不可能/不想使用 IWindsorInstaller 接口,则没有“内置”方法可以做到这一点,但可以通过注册多个 IMyStartable 类型(例如)并使用 ResolveAll&lt;IMyStartable&gt; 来完成 - 并且仍然在 Castle Windsor 内并依次调用每个上的“开始”方法。 Castle Windsor 当然可以通过其反射流式 API 为给定接口注册所有组件。
  • 也有可能为此目的重新利用部分 fluent API(或检查其源代码).. 但是上面讨论的两种方法在“内部”构建的 Castle Window 中工作-在设施中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多