1

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

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

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

IApplicationContext.GetObject("Rule1") 

这再次意味着我在这里与春天联系在一起。我想在 spring 中以 FactoryObject 的形式提供了一些支持我不确定是否可以将其配置为返回对已由 Spring 框架使用 Id 初始化的每个 Rule 对象的访问权限??..
或者是否有当要创建动态对象时更好的做事方式..

4

1 回答 1

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

于 2013-08-06T13:22:07.117 回答