我使用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对象的访问权限。
或者在创建动态对象时有更好的方法吗?
答案 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