摘要

使用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配置的更多相关文章

  1. Ninject之旅目录

    第一章:理解依赖注入 Ninject之旅之一:理解DI 第二章:开始使用Ninject Ninject之旅之二:开始使用Ninject(附程序下载) Ninject之旅之三:Ninject对象生命周期 ...

  2. Ninject之旅之一:理解DI

    摘要: DI(IoC)是当前软件架构设计中比较时髦的技术.DI(IoC)可以使代码耦合性更低,更容易维护,更容易测试.现在有很多开源的依赖反转的框架,Ninject是其中一个轻量级开源的.net DI ...

  3. Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

    本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...

  4. Spring_Task初探(注解,XML配置)

    这几天想写一个动态添加任务项目找了找Spring下的自带定时功能发现还真有,然后网上找了找资料写了个demo 写了两种方式来执行定时的任务(XML配置和注解) 先建两个普通的任务类(XML配置调用的任 ...

  5. Mybatis XML配置

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  6. SpringMvc的xml配置与annotation配置的例子的区别

    1.导入jar包时,要在xml配置基础上加 spring-aop-4.2.2.RELEASE.jar (注解的时候需要) 2.编写controller的时候要annotation需要做相关配置即红色部 ...

  7. Hibernate实现有两种配置,xml配置与注释配置

    hibernate实现有两种配置,xml配置与注释配置. (1):xml配置:hibernate.cfg.xml (放到src目录下)和实体配置类:xxx.hbm.xml(与实体为同一目录中) < ...

  8. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  9. 关于xml配置实现AOP的小知识

    除了前面介绍的基于JDK1.5的注解方式来定义切面,切入点和增强处理外,Spring AOP也允许直接使用XML配置文件来管理它们.在JDK1.5之前,只能使用配置文件的方式来管理,在Spring2. ...

随机推荐

  1. 【java规则引擎】之Drools之Rete算法

    一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...

  2. Vector 和 ArrayList 区别

    1.Vector是多线程安全的,而ArrayList不是,如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些:Vector是旧的,是java一诞生就提供了的 ...

  3. unity, 按类型查找文件

  4. 转:linux lsof命令详解

    简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

  5. arcgis 10.2连接Oracle

  6. 在CentOS上安装和部署Shiny Server

    1.安装R: sudo yum install R 2.安装Shiny的R包: sudo su - \ -c "R -e \"install.packages('shiny', r ...

  7. vscode配置

    默认的挺难看的 颜色主题换成 Monokai Dimmed 用户设置 // 将设置放入此文件中以覆盖默认设置 { "editor.fontFamily": "Monaco ...

  8. sublime text2在windows中以命令行启动

    sublime text2在windows中以命令行启动   把执行文件添加到PATH中即可,如图: 如果你和我一样习惯了mac下的简写subl,那么需要在程序目录中新建一个批处理文件subl.bat ...

  9. Nexus3.0.0+Maven的使用(二)

    因为Nexus3.0.0与Nexus2.X系列的差别很大,所以本章节我大概讲解下Nexus3.0.0的功能使用. 1.功能介绍 1.1  Browse Server Content 1.1.1  Se ...

  10. 每天一个 Linux 命令(18):locate 命令

    locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...