初始化/访问实现单个接口的动态对象

时间:2013-08-06 12:13:39

标签: c# dependency-injection spring.net

我使用Spring.Net作为我的DI在MVC3应用程序中使用服务层 - 存储库(Nhibernate)。

在我的服务层中我使用的是责任链模式,并且想初始化一组规则(实现公共接口Rule1,Rule2,Rule3的对象)。实现规则的每个类都存储在DB中,其中包含Sequence和名称,可以添加或删除。 示例
规则1:IRule
         规则2:IRule
         规则3:IRule

在我的Spring配置中,我将所有规则的定义都列为了Id。

在我的服务层中,我提取所有规则名称,并且必须初始化每个规则并根据序列一个接一个地执行规则。 我的服务层代码不应该绑定到Spring,因此我不想在这里使用Service Locator模式..

我想访问下面的每个规则。通过规则工厂对象。

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内部访问已经在配置中定义的规则对象的最佳方式是什么...我的意思是我的rulefactory应该最终使用

IApplicationContext.GetObject("Rule1") 

这再次意味着我在这里与春天联系在一起。我想在Spring中有一些FactoryObject形式的支持我不确定它是否可以配置为返回我使用Id ??已经由Spring框架初始化的每个Rule对象的访问权限。

或者在创建动态对象时有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我不确定这是否是您正在寻找的,但如果您的所有规则都是运行时执行程序集的一部分,您可以执行类似的操作

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