我有一个用 Windsor 构建的应用程序,该应用程序具有功能,并且所有组件都在 xml 中手动注册,其中还包含其配置。这是一个例子:
<component type="type">
<parameters>
[...]
</parameters>
</component>
我决定重构我的组件并将它们分离到温莎安装程序中,每个功能都有一个安装程序。我现在的问题是决定将每个安装程序中注册的组件的配置放在哪里。
在此决定之前,用户可以在 xml 的参数元素内找到组件的适当配置,并且我不必为此编写连线逻辑即可工作。
现在我有点困惑,因为我似乎不再有这样的自动性了。由于我决定通过 xml 声明应用程序的安装程序,因此我认为如果我可以将此配置放入 installr 元素中,如下所示,那就完美了:
<installers>
<install assembly="myassembly">
<parameters>
[...]
<parameters>
</install>
</installers>
不知道Windsor是否支持这种语法。如果确实如此,那么我想知道如何从安装程序内部访问它以及如何将其连接到我的组件和服务。
另一个可接受的替代方案可能是在 xml 上创建并注册一个包含我的功能的所有配置的组件:
<components>
<component type="featureConfiguration">
<parameters>
</parameters>
</component>
</components>
在这种情况下,我想我必须重构我的组件,让它们在构造函数中接收此类类型作为参数,而在我拥有直接属性之前,换句话说,在我可以通过查看来准确判断我的组件的依赖项是什么之前在代码中,通过这个新表单,我将整个配置传递给他们,但我不再知道在这个或那个组件中使用了配置的哪些特定属性。
要使用第二个解决方案并避免这种困惑,我应该避免将整个配置传递给我的子组件,并让单个属性完成工作,但我必须找到此配置组件的属性和安装程序的组件和服务的属性。
我认为,除了组件之外,我还可以将所有配置放在 xml 的属性元素中:
<properties>
<featureConfiguration>
[property list]
</featureConfiguration>
</properties>
但同样,我必须找到列表中每个属性与组件属性之间的联系。
感谢任何帮助。
谢谢。
最佳答案
也许您会发现这种混合解决方案很有帮助,具体取决于您所需组件的参数化级别。也就是说,您可以在安装程序中执行组件注册,并在 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。但您也可以使用默认的全名。
温莎配置文件可能如下所示:
<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方法的顺序很重要;您必须首先安装配置文件设置。
关于caSTLe-windsor - 温莎安装程序配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19001851/