【问题标题】:How to run the supplied IOC (Inversion Of Control) demo from Castle Windsor docs?如何运行 Castle Windsor 文档中提供的 IOC(控制反转)演示?
【发布时间】:2012-01-07 19:37:32
【问题描述】:

IOC Castle Windsor wiki[编者注:写完这个问题后,wiki已经更新了更多示例代码],有以下(不完整的)演示代码。

如何完成此代码以使其在 C# 控制台应用程序中正常运行?

//application starts...
var container = new WindsorContainer();

// adds and configures all components using WindsorInstallers from executing assembly
container.Install(FromAssembly.This());

// instantiate and configure root component and all its dependencies and their dependencies and...
var king = container.Resolve<IKing>();
king.RuleTheCastle();

// clean up, application exits
container.Dispose();

更新:

发现tutorial videos on IOC in general

至于添加接口和接口的具体实现:

interface IKing
{
    void RuleTheCastle();   
}

public class King
{
    void RuleTheCastle()
    {
        Consolel.Write("Rule the castle.");
    }
}

但是,当我运行它时,它引发了运行时错误。

更新:

我最终使用了Ninject,因为:

  1. 文档远远优于 Castle Windsor(以及 Spring.NET)。
  2. 它使用 expression compilation/LCG,因此与使用反射的 Castle Windsor 相比,它的速度更快(8 倍到 50 倍)。

要开始使用,请点击“参观道场”,然后通过series of NInject tutorials on GitHub 进行操作。

完成此操作后,您可以查看tutorial video on TekPub。该视频确实很快地介绍了这些概念,因此最好先完成series of NInject tutorials on GitHub

【问题讨论】:

  • 呃,为什么要投反对票?如果温莎城堡真的像想象的那么简单,那么完成温莎wiki上的示例演示代码不应该很简单吗?
  • 除了示例之外,你还写了一些代码吗?如果没有,您需要创建 IKing 接口,创建一个实现 IKing 接口的具体类,并创建一个配置来告诉 Castle.Windsor 将 IKing 解析为您的具体类。
  • 我已经创建了 IKing 接口,并创建了一个实现 IKing 接口的具体类。我没有创建一个配置来告诉 Castle.Windsor 在哪里将 IKing 解析为具体类 - 我认为这会自动发生。
  • 您需要在程序集中添加一个Windsor Installer,让Windsor知道IKing接口将在运行时由King具体类解析。

标签: c# inversion-of-control castle-windsor


【解决方案1】:

通常,为了在 C# 控制台应用程序中应用 IoC,您将使用入口点(例如 Main 方法)来:

  • 实例化和配置 IoC 容器 - 示例代码中的前两行
  • 使用容器构建对象图(对象及其依赖项)-第三行代码
  • 将控制权传递给已解析的对象,通常通过调用其上的方法 - 第 4 行代码
  • 应用程序完成后,告诉容器执行它需要执行的任何清理 - 第 5 行代码

这就是代码演示所呈现的内容,从这个角度来看,它是完整的。

但是,要使此应用程序正常运行,还有两个非常重要的先决条件:

  • 应用程序的设计必须考虑到控制反转原则(这实际上是困难的部分)
  • 控制台应用程序的入口点程序集必须包含Windsor Installers,用于配置容器,并且基本上定义了在需要接口时将使用的具体类型。

本示例中的 Installer 类的代码如下所示:

public class KingApplicationInstaller : IWindsorInstaller
{
   public void Install(IWindsorContainer container, IConfigurationStore store)
   {
        container.Register(
            Component.For<IKing>().ImplementedBy<King>());
   }
}

【讨论】:

  • 太棒了!我现在就试试。
  • 首页上的代码应该只是向您展示如何使用WindsorContainer 类,而不是完整的示例应用程序。因此它不包括IKingKing 类型,也不包括它们的(隐含的)安装程序。我确实意识到缺少新人的安装程序可能太让人费解了,所以我添加了一个。
  • @KrzysztofKoźmic:为您添加的 conventions-based 安装程序示例 +1。这让我想起了你在 2011 年 NDC 上发表的非常鼓舞人心的演讲。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多