摘要
使用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");
作者:丹尼大叔
出处:http://www.cnblogs.com/uncle_danny
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。