我有一个使用Windsor构建的应用程序,该应用程序具有功能,并且所有组件都在xml中手动注册,该xml也包含其配置。这是一个例子:
<component type="type">
<parameters>
[...]
</parameters>
</component>
我决定重构我的组件,并将它们分成windsor安装程序,每个功能一个安装程序。我现在的问题是决定将每个安装程序中注册的组件的配置放在哪里。
在做出此决定之前,用户可以在xml的parameters元素中找到组件的适当配置,而我不必编写有线逻辑即可工作。
现在我有些困惑,因为似乎我已经没有这种自动机了。由于我决定通过xml声明应用程序的安装程序,因此我认为将这种配置放入installr元素中可能是完美的:
<installers>
<install assembly="myassembly">
<parameters>
[...]
<parameters>
</install>
</installers>
我不知道温莎是否支持这种语法。如果是这样,那么我想知道如何从安装程序内部访问它,以及如何将其连接到我的组件和服务。
另一个可行的替代方法是在xml上创建并注册一个包含我功能的所有配置的组件:
<components>
<component type="featureConfiguration">
<parameters>
</parameters>
</component>
</components>
在这种情况下,我猜想我必须重构组件,以使它们在其构造函数中接收此类参数,而在拥有直接属性之前,换句话说,在我可以通过查看代码确切分辨出组件的依赖关系之前,通过这种新形式,我将整个配置传递给他们,但我现在不知道在此组件中使用了哪些特定配置属性。
为了使用第二种解决方案并避免这种混乱,我应该避免将整个配置传递给子组件,并让单个属性完成工作,但是我必须在此配置组件的属性与安装程序的组件和服务。
我认为,除了组件之外,我还可以将所有配置放入xml的properties元素中:
<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方法的顺序很重要。您必须首先安装配置文件设置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句