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. 创建接口和类
using System.Linq; namespace Demo.Ninject
{
public interface IEncryptor
{
string Encrypt(string str);
} public class ReverseEncryptor : IEncryptor
{
public string Encrypt(string str)
{
var charArray = str.Reverse().ToArray();
return new string(charArray);
}
} public class ShiftEncryptor : IEncryptor
{
public string Encrypt(string str)
{
var charArray = str.Select(c => (char)(c + )).ToArray();
return new string(charArray);
}
}
}
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函数。
using Ninject;
using System; namespace Demo.Ninject
{
class Program
{
static void Main(string[] args)
{
using (var kernel = new StandardKernel())
{
kernel.Load("TypeRegistrations.xml");
var encryptor = kernel.Get<IEncryptor>();
Console.WriteLine(encryptor.Encrypt("Hello")); Console.ReadLine();
}
}
}
}
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配置的更多相关文章
- Ninject之旅目录
第一章:理解依赖注入 Ninject之旅之一:理解DI 第二章:开始使用Ninject Ninject之旅之二:开始使用Ninject(附程序下载) Ninject之旅之三:Ninject对象生命周期 ...
- Ninject之旅之一:理解DI
摘要: DI(IoC)是当前软件架构设计中比较时髦的技术.DI(IoC)可以使代码耦合性更低,更容易维护,更容易测试.现在有很多开源的依赖反转的框架,Ninject是其中一个轻量级开源的.net DI ...
- Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较
本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...
- Spring_Task初探(注解,XML配置)
这几天想写一个动态添加任务项目找了找Spring下的自带定时功能发现还真有,然后网上找了找资料写了个demo 写了两种方式来执行定时的任务(XML配置和注解) 先建两个普通的任务类(XML配置调用的任 ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- SpringMvc的xml配置与annotation配置的例子的区别
1.导入jar包时,要在xml配置基础上加 spring-aop-4.2.2.RELEASE.jar (注解的时候需要) 2.编写controller的时候要annotation需要做相关配置即红色部 ...
- Hibernate实现有两种配置,xml配置与注释配置
hibernate实现有两种配置,xml配置与注释配置. (1):xml配置:hibernate.cfg.xml (放到src目录下)和实体配置类:xxx.hbm.xml(与实体为同一目录中) < ...
- java web.xml配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- 关于xml配置实现AOP的小知识
除了前面介绍的基于JDK1.5的注解方式来定义切面,切入点和增强处理外,Spring AOP也允许直接使用XML配置文件来管理它们.在JDK1.5之前,只能使用配置文件的方式来管理,在Spring2. ...
随机推荐
- out.print()和response.getWriter().write()区别
1.print()和write()区别: write():表示的是仅支持输入字符类型数据,字符,字符数组和字符串等, print():表示的是将各种数据类型(包括object)的数据通过默认编码换成b ...
- 【python】遍历类的所有成员
# -*- coding: utf-8 -*- #sharejs.com提供代码,转载请注明出处 class Site(object): def __init__(self): self.title ...
- MyBatis入门学习教程-调用存储过程
一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_incr ...
- Building GCC 4.1.2 in CentOS 7 for Maya API development
Following the official guid: http://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/files/Setting_up_y ...
- vue组件一
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- AMap编辑折线、多边形、圆
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- HttpWebRequest-header设置
http://www.cnblogs.com/yczz/archive/2012/06/01/2530484.html http://blog.csdn.net/htsnoopy/article/de ...
- Server Name Indication(SNI)
转载自: http://openwares.net/misc/server_name_indication.html Server Name Indication是用来改善SSL(Secure Soc ...
- Installing Intellij IDEA sublime-text-2 on Ubuntu
he installation on Linux is traditionally more complicated. I wonder why people complain about the l ...
- SparkSQL DataFrames操作
Hive中已经存在emp和dept表: select * from emp; +--------+---------+------------+-------+-------------+------ ...