我有一个使用Windsor构建的应用程序,此应用程序具有功能,并且组件在xml中手动注册,其中也包含其配置。这是一个例子:
<component type="type">
<parameters>
[...]
</parameters>
</component>
我决定重构我的组件并将它们分成windsor安装程序,每个功能都有一个安装程序。我现在的问题是决定在每个安装程序中注册的组件配置的位置。
在做出这个决定之前,用户可以在xml的parameters元素中找到组件的相应配置,而且我没有必要编写有线逻辑来实现它。
现在我有点困惑,因为我似乎没有这样的自动化。由于我决定通过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>
但同样,我必须找到列表中每个属性和组件属性之间的粘合剂。
感谢任何帮助。
谢谢。
答案 0 :(得分: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方法的顺序很重要;您必须先安装配置文件设置。