C# 初始化/访问实现单个接口的动态对象
我在一个带有服务层存储库(Nhibernate)的MVC3应用程序中使用Spring.Net作为我的DI 在我的服务层中,我正在使用责任链模式,并希望初始化一组规则(实现公共接口Rule1、Rule2、Rule3的对象)。实现该规则的每个类都存储在数据库中,其顺序与名称一起,并且可以添加或删除。 示例C# 初始化/访问实现单个接口的动态对象,c#,dependency-injection,spring.net,C#,Dependency Injection,Spring.net,我在一个带有服务层存储库(Nhibernate)的MVC3应用程序中使用Spring.Net作为我的DI 在我的服务层中,我正在使用责任链模式,并希望初始化一组规则(实现公共接口Rule1、Rule2、Rule3的对象)。实现该规则的每个类都存储在数据库中,其顺序与名称一起,并且可以添加或删除。 示例规则1:IRule 规则2:病毒 规则3:病毒 在我的Spring配置中,我有所有规则的定义,这些规则的类名是Id。 在我的服务层中,我提取所有规则名称,并且必须初始化每个规则,并根据顺序一个接一个
规则1:IRule
规则2:病毒
规则3:病毒
在我的Spring配置中,我有所有规则的定义,这些规则的类名是Id。 在我的服务层中,我提取所有规则名称,并且必须初始化每个规则,并根据顺序一个接一个地执行规则。 我的服务层代码不应该绑定到Spring,因此我不想在这里使用服务定位器模式 我想访问下面的每个规则。通过规则工厂对象
public class ServiceLayer
{
public Constructor ServiceLayer(IRuleFactory ruleFactory)
{
//Rule factory injected using Spring
}
var rules = fetchRulesFromRepoitory();
foreach( rule in rules)
{
var ruleclass = ruleFactory.GetObject("rule.Name");
ruleclass.Execute();
}
}
在rulefactory中,访问配置中已定义的规则对象的最佳方式是什么。。我的意思是我的规则工厂是否应该使用
IApplicationContext.GetObject("Rule1")
这也意味着我在这里被春天束缚住了。我认为spring中有一些FactoryObject形式的支持,我不确定是否可以将其配置为返回对spring框架使用Id初始化的每个规则对象的访问权???。或者,在创建动态对象时,是否有更好的方法进行操作。我不确定这是否正是您想要的,但如果您的所有规则都是运行时执行程序集的一部分,您可以执行类似的操作
var implementations = (from c in Assembly.GetExecutingAssembly().GetTypes()
where typeof(IRule).IsAssignableFrom(c) && !c.IsInterface
select (IRule)Activator.CreateInstance(c)).ToList();
这将创建一个IRule列表,其中包含每个规则的唯一实例。你需要参考System.Reflection和System.Linq请看-它看起来与这个问题类似。谢谢@Marijin你提到的链接看起来很接近我想要的。我想知道Spring.net是否具有开箱即用的支持,但我不知道。最接近开箱即用的(afaik)是,这与上面链接的问题有关。谢谢Anthony,这确实有效,但我只希望Spring.net进行对象初始化。。