首页 > 代码库 > Ninject之旅之五:Ninject XML配置

Ninject之旅之五:Ninject XML配置

摘要

使用XML配置,需要添加Ninject XML扩展的引用。下一步是添加一个或多个包含类型注册的XML文件。记得这些文件应该跟应用程序一起发布。因此不要忘记将XML文件的属性设置成“Copy if newer”。

 

XML配置文件像下面的配置一样:

<module name="moduleName">  <bind service="Namespace.IService1, AssemblyName"    to="Namespace.ConcreteService1, AssemblyName" />  <bind service="Namespace.IService2, AssemblyName"    to="Namespace.ConcreteService2, AssemblyName"    Scope="singleton"/></module>

每个绑定元素包含至少两个属性:

  • Service:代表服务类型,经常是一个接口或是抽象类
  • To:代表具体类型,服务类型的具体实现

 

下面给出一个Ninject XML配置的例子。创建一个IEncryptor接口,接口提供一个加密方法Encrypt。两个不同的加密算法类(ReverseEncryptor和ShiftEncryptor)继承IEncryptor接口,这两个算法类提供了两种加密算法。在XML配置文件里动态配置使用其中的一个具体算法类。这个配置可以在之后不重新编译程序的情况下动态修改,影响应用程序的行为。

1. 使用NuGet工具添加Ninject.Extensions.Xml引用,注意Dependencies。

技术分享

2. 创建接口和类

 1 using System.Linq; 2  3 namespace Demo.Ninject 4 { 5     public interface IEncryptor 6     { 7         string Encrypt(string str); 8     } 9 10     public class ReverseEncryptor : IEncryptor11     {12         public string Encrypt(string str)13         {14             var charArray = str.Reverse().ToArray();15             return new string(charArray);16         }17     }18 19     public class ShiftEncryptor : IEncryptor20     {21         public string Encrypt(string str)22         {23             var charArray = str.Select(c => (char)(c + 1)).ToArray();24             return new string(charArray);25         }26     }27 }

3. 创建XML配置文件:TypeRegistrations.xml

<?xml version="1.0" encoding="utf-8" ?><module name="encryptorModule">  <bind service="Demo.Ninject.IEncryptor, Demo.Ninject" to="Demo.Ninject.ShiftEncryptor, Demo.Ninject" /></module>

我的应用程序assembly名称是Demo.Ninject,接口和类所在的名称空间是Demo.Ninject。

设置xml文件的Copy if newer属性:

技术分享

4. 修改Main函数。

 1 using Ninject; 2 using System; 3  4 namespace Demo.Ninject 5 { 6     class Program 7     { 8         static void Main(string[] args) 9         {10             using (var kernel = new StandardKernel())11             {12                 kernel.Load("TypeRegistrations.xml");13 14                 var encryptor = kernel.Get<IEncryptor>();15                 Console.WriteLine(encryptor.Encrypt("Hello"));16 17                 Console.ReadLine();18             }19         }20     }21 }

5. 编译程序,在bin\Debug文件夹下找到应用程序的exe文件,双击执行。得到ShiftEncryptor算法的结果。

技术分享

6.  用记事本打开文件TypeRegistrations.xml,修改bind节的to属性,改成ReverseEncryptor。

 技术分享

7. 直接再次运行exe文件,得到ReverseEncryptor算法的结果。不重新编译应用程序的情况下,通过XML文件动态改变了绑定类型。

技术分享

 

下面的代码片段演示了怎样将多个XML文件加载到kernel内。

kernel.Load("module1.xml","module2.xml","module3.xml");

可以使用相对输出路径的路径,也可以使用绝对路径。

也可以使用通配符“*”。下面的代码例子中,kernel加载正在执行的assembly的同样路径下所有的xml文件:

kernel.Load("*.xml");

下面的例子中,kernel加载应用程序目录下的Modules文件夹内的所有xml文件:

kernel.Load("Modules/*.xml");

 

Ninject之旅之五:Ninject XML配置