Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 初始化/访问实现单个接口的动态对象_C#_Dependency Injection_Spring.net - Fatal编程技术网

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

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。 在我的服务层中,我提取所有规则名称,并且必须初始化每个规则,并根据顺序一个接一个

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

在我的服务层中,我正在使用责任链模式,并希望初始化一组规则(实现公共接口Rule1、Rule2、Rule3的对象)。实现该规则的每个类都存储在数据库中,其顺序与名称一起,并且可以添加或删除。 示例
规则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进行对象初始化。。