C# Ninject-Xml配置模块

C# Ninject-Xml配置模块,c#,xml,dependency-injection,ninject,C#,Xml,Dependency Injection,Ninject,我有一个在多个类中实现的接口。这些类处理其非常特定的任务,这些任务的目的是。所以我试图通过ninject获得我想要的类的实例。这些绑定需要在XML文件中设置,并加载我需要的任何类实例 绑定XML <?xml version="1.0" encoding="utf-8" ?> <module name="Downloader"> <bind service="Microsoft.Azure.Management.DataFactories.Runtime.IDot

我有一个在多个类中实现的接口。这些类处理其非常特定的任务,这些任务的目的是。所以我试图通过ninject获得我想要的类的实例。这些绑定需要在XML文件中设置,并加载我需要的任何类实例

绑定XML

<?xml version="1.0" encoding="utf-8" ?>
<module name="Downloader">
  <bind service="Microsoft.Azure.Management.DataFactories.Runtime.IDotNetActivity, Microsoft.Azure.Management.DataFactories" 
        to="TV.ABC.InvoiceDownloader, TV.ABC" />
  <bind service="Microsoft.Azure.Management.DataFactories.Runtime.IDotNetActivity, Microsoft.Azure.Management.DataFactories"
        to="TV.ABC.PaymentsDownloader, TV.ABC" />
</module>
public class Program
    {
        static void Main(string[] args)
        {
            var settings = new NinjectSettings { LoadExtensions = false };
            var kernel = new StandardKernel(settings, new XmlExtensionModule());
            string executionPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            XDocument xDoc = XDocument.Load(string.Format(@"{0}\NinjectModules.xml", executionPath));

            IEnumerable<INinjectModule> modules = GetModules(kernel, xDoc);
            kernel.Load(modules);

            var objtest = kernel.Get<IDotNetActivity>();
        }

        private static IEnumerable<INinjectModule> GetModules(IKernel kernel, XDocument document)
        {
            var elementProcessors = kernel.Components.GetAll<IModuleChildXmlElementProcessor>()
                                          .ToDictionary(processor => processor.XmlNodeName);

            return (from moduleElement in document.Elements("module")
                    select new XmlModule(moduleElement, elementProcessors)).Cast<INinjectModule>();
        }
    }

代码

<?xml version="1.0" encoding="utf-8" ?>
<module name="Downloader">
  <bind service="Microsoft.Azure.Management.DataFactories.Runtime.IDotNetActivity, Microsoft.Azure.Management.DataFactories" 
        to="TV.ABC.InvoiceDownloader, TV.ABC" />
  <bind service="Microsoft.Azure.Management.DataFactories.Runtime.IDotNetActivity, Microsoft.Azure.Management.DataFactories"
        to="TV.ABC.PaymentsDownloader, TV.ABC" />
</module>
public class Program
    {
        static void Main(string[] args)
        {
            var settings = new NinjectSettings { LoadExtensions = false };
            var kernel = new StandardKernel(settings, new XmlExtensionModule());
            string executionPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            XDocument xDoc = XDocument.Load(string.Format(@"{0}\NinjectModules.xml", executionPath));

            IEnumerable<INinjectModule> modules = GetModules(kernel, xDoc);
            kernel.Load(modules);

            var objtest = kernel.Get<IDotNetActivity>();
        }

        private static IEnumerable<INinjectModule> GetModules(IKernel kernel, XDocument document)
        {
            var elementProcessors = kernel.Components.GetAll<IModuleChildXmlElementProcessor>()
                                          .ToDictionary(processor => processor.XmlNodeName);

            return (from moduleElement in document.Elements("module")
                    select new XmlModule(moduleElement, elementProcessors)).Cast<INinjectModule>();
        }
    }
公共类程序
{
静态void Main(字符串[]参数)
{
var settings=new NinjectSettings{LoadExtensions=false};
var kernel=新的标准内核(设置,新的XmlExtensionModule());
字符串executionPath=Path.GetDirectoryName(Assembly.getExecutionGassembly().Location);
XDocument xDoc=XDocument.Load(string.Format(@“{0}\NinjectModules.xml”,executionPath));
IEnumerable modules=GetModules(内核,xDoc);
内核加载(模块);
var objtest=kernel.Get();
}
私有静态IEnumerable GetModules(IKernel内核、XDocument文档)
{
var elementProcessors=kernel.Components.GetAll()
.ToDictionary(processor=>processor.XmlNodeName);
返回(来自document.Elements(“模块”)中的moduleElement)
选择new XmlModule(moduleElement,elementProcessors)).Cast();
}
}
我希望加载XML文件中定义的所有模块

输出如下,抛出一个错误 Ninject.ActivationException:'激活IDotNetActivity时出错 有多个匹配绑定可用。
匹配绑定:
1) 从IDotNetActivity到CustomerVoiceDownloaderActivity的绑定
2) 从IDotNetActivity到CustomerPaymentsDownloaderActivity的绑定

激活路径:
1) 请求IDotNetActivity

建议:
1) 确保仅为IDotNetActivity定义了一次绑定。 '


有人能帮我解释为什么会出现这个问题吗?

这是预期行为。使用
kernel.GetAll()
检索预期行为的所有实现。使用
kernel.GetAll()
检索所有实现