摘要
使用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 : IEncryptor 11 { 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 : IEncryptor 20 { 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");