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

本文关键字:动态 对象 接口 单个 访问 实现 初始化 | 更新日期: 2023-09-27 18:26:44

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

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

在我的Spring配置中,我有所有规则的定义,类名为Id。

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

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

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初始化的每个Rule对象的访问
或者,在创建动态对象时,有没有更好的方法。。

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

我不确定这是否正是你想要的,但如果你的所有规则都是运行时执行程序集的一部分,你可以做一些类似于的事情

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