C# 来自xml的Ninject依赖项绑定

C# 来自xml的Ninject依赖项绑定,c#,c#-4.0,dependency-injection,ninject,C#,C# 4.0,Dependency Injection,Ninject,正如您所知,Ninject内核绑定是这样的 kernel.Bind<IMyService>().To<MyService>(); kernel.Bind().To(); 我想从xml获取MyService。像这样的WebConfig或App.Config <add key="service" value="MyNamespace.MyService"> 我可以在代码中得到这个字符串。但是我怎么用呢 kernel.Bind().To() 或者NiNiJ

正如您所知,Ninject内核绑定是这样的

kernel.Bind<IMyService>().To<MyService>();
kernel.Bind().To();
我想从xml获取MyService。像这样的WebConfig或App.Config

<add key="service" value="MyNamespace.MyService">

我可以在代码中得到这个字符串。但是我怎么用呢

kernel.Bind().To()


或者NiNiJet可以默认支持此功能吗?

您可以使用非通用的
To(Type)
重载

从app.config获取类型:

string service = ConfigurationManager.AppSettings["service"];
Type serviceType = AssemblyContainingYourType.GetType(service);
使用以下类型:

kernel.Bind<IMyService>().To(serviceType);
kernel.Bind().To(serviceType);

总之,请理解,
Ninject
鼓励您在代码中配置绑定,而不依赖于配置文件。

我自己在我的任何项目中都没有使用过它,但Ninject xml扩展可能会有所帮助



但不确定是否可以将其存储在App.config文件中。

最终获得了解决方案。不要忘记将此文件的xml file Directory属性的Copy to Output设置为Copy(如果较新),以便可以将其自动复制到输出目录

Ninject内核绑定如下:-

创建XML,如下所示:-

<module name="myXmlConfigurationModule">
    <bind service="MyNamespace.IMyService, MyAssembly"
          to="MyNamespace.MyServiceImplementation, MyAssembly" />
    <bind service="MyNamespace.IMyOtherService, MyAssembly"
          to="MyNamespace.MyOtherServiceImplementation, MyAssembly" />
</module>

然后编码:-

using Ninject;

    enter code here

     class ABC
        {
          public void CallingMethodUsingNinject()
            {
               private IKernel kernel= new StandardKernel();
               kernel.Load("yourXmlFileName.xml");
               bool ismodule = kernel.HasModule("myXmlConfigurationModule");//To Check The module 
               if(ismodule )
               {           
               IMyService MyServiceImplementation = kernel.Get<IMyService>();
               MyServiceImplementation.YourMethod();
               }
           }
       }
使用Ninject;
在这里输入代码
ABC班
{
使用ninject()的公共无效调用方法
{
私有IKernel内核=新标准内核();
Load(“yourXmlFileName.xml”);
bool ismodule=kernel.HasModule(“myXmlConfigurationModule”);//检查模块
if(ismodule)
{           
IMyService MyServiceImplementation=kernel.Get();
MyServiceImplementation.YourMethod();
}
}
}
由于XML文件属性设置的原因,您可能会遇到一些问题,因此需要更改XML文件设置。
激活IMyService时出错没有匹配的绑定可用,并且类型不可自绑定。 解决方案:-不要忘记将副本设置为输出 要复制的此xml文件的目录属性(如果较新),以便可以将其复制到 自动输出目录

更多信息:-请阅读

您可以尝试:

Bind<IClientChannelFactory<ICustomerServiceChannel>>()
  .To<ClientChannelFactory<ICustomerServiceChannel>>() 
  .WithConstructorArgument("endpointConfigurationName", ServiceBinding);
Bind()
.至()
.WithConstructorArgument(“endpointConfigurationName”,ServiceBinding);

AssemblyContainingYourType?在其中实现了
MyNamespace.MyService
的程序集。为什么不建议使用它?使用XML看起来更好,因为您不必重新编译project@Marc:推荐信由NInject的作者撰写。这是个人的选择。随着应用程序的增长,XML配置很难维护。我可以在config中指定程序集名称或完整的命名空间吗?如果我想在运行时交换一个具体的实现而不涉及代码呢?我使用了这个kernel.Load(“configuration.xml”);但是不起作用。xml看起来怎么样?错误是什么?什么不起作用?激活IMyService时出错没有匹配的绑定可用,并且类型不可自绑定。激活路径:1)请求IMyService建议:1)确保已为IMyService定义绑定2)如果绑定是在模块中定义的,请确保模块已加载到内核中。3) 确保没有意外创建多个内核。4) 如果使用构造函数参数,请确保参数名称与构造函数参数名称匹配。5) 如果使用的是自动模块加载,请确保搜索路径和筛选器正确。请确保在
属性中将XML文件设置为“始终复制/更新时”。似乎如果文件不在那里,它就不会抛出。
Bind<IClientChannelFactory<ICustomerServiceChannel>>()
  .To<ClientChannelFactory<ICustomerServiceChannel>>() 
  .WithConstructorArgument("endpointConfigurationName", ServiceBinding);