2

我有一个使用 Windsor 构建的应用程序,该应用程序具有功能,并且所有组件都是在 xml 中手动注册的,其中还包含它们的配置。这是一个例子:

<component type="type">
  <parameters>
      [...]
  </parameters>
</component>

我决定重构我的组件并将它们分成 Windsor 安装程序,每个功能一个安装程序。我现在的问题是决定将每个安装程序中注册的组件的配置放在哪里。

在此决定之前,用户可以在 xml 的参数元素中找到组件的适当配置,而我不必为此工作编写连线逻辑。

现在我有点困惑,因为我似乎不再有这种自动化。由于我决定通过 xml 声明我的应用程序的安装程序,我认为如果我可以将此配置放入 installr 元素中,如下所示:

<installers>
 <install assembly="myassembly">
  <parameters>
    [...]
  <parameters>
 </install>
</installers>

我不知道 Windsor 是否支持这种语法。如果是这样,那么我想知道如何从安装程序内部访问它以及如何将它连接到我的组件和服务。

另一个可接受的替代方法是在 xml 上创建和注册一个包含我的功能的所有配置的组件:

<components>
 <component type="featureConfiguration">
  <parameters>
  </parameters>
 </component>
</components>

在这种情况下,我想我必须重构我的组件以让它们在构造函数中接收这种类型作为参数,而在我拥有直接属性之前,换句话说,在我可以通过查看代码准确地知道我的组件的依赖关系之前,通过这种新形式,我将整个配置传递给他们,但我不再知道在这个或那个组件中使用了配置的哪些特定属性。

要使用第二种解决方案并避免这种混淆,我应该避免将整个配置传递给我的子组件,并让单个属性完成工作,但我必须在此配置组件的属性和安装程序的组件和服务。

我认为除了组件之外,我还可以将所有配置放在 xml 的 properties 元素中:

<properties>
 <featureConfiguration>
   [property list]
 </featureConfiguration>
</properties>

但同样,我必须找到列表中每个属性与我的组件属性之间的粘合剂。

任何帮助表示赞赏。

谢谢你。

4

1 回答 1

2

也许您会发现这种混合解决方案很有帮助,具体取决于您需要的组件的参数化级别。即,您可以在安装程序中执行组件注册,并在 Windsor 配置文件中设置组件的参数。当您需要对少数组件进行参数化同时让 Windsor 处理所有其他依赖项时,这很有用。

示例:假设您有以下组件。

public class MyComponent
{
    public MyComponent(MyDependency dependency, string stringParameter, DateTime dateParameter)
    {
        this.Dependency = dependency;
        this.StringParameter = stringParameter;
        this.DateParameter = dateParameter;
    }

    public DateTime DateParameter { get; set; }

    public string StringParameter { get; set; }

    public MyDependency Dependency { get; set; }
}

public class MyDependency
{
}

然后您可以使用以下安装程序来注册它们。

public class MyInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<MyComponent>().Named("MyComponent"));
        container.Register(Component.For<MyDependency>());
    }
}

请注意,我们已经明确了组件的唯一名称,设置为MyComponent。但您也可以使用默认全名。

Windsor 配置文件可能如下所示:

<configuration>
    <components>
        <component id="MyComponent">
            <parameters>
                <stringParameter>Some string</stringParameter>
                <dateParameter>2013/09/25</dateParameter>
            </parameters>
        </component>
    </components>
</configuration>

现在您可以将它们包装在一起:

WindsorContainer container = new WindsorContainer();
container.Install(Configuration.FromXmlFile("windsor.config"));
container.Install(FromAssembly.This());

请注意,调用 Install 方法的顺序很重要;您必须首先安装配置文件设置。

于 2013-09-25T13:11:36.680 回答