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 : 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
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值