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. ...
随机推荐
- 关于C语言的一些trick
很多东西已经记不起来了,想到一点写一点,碰到一点写一点,慢慢累积. 关于# #在宏定义中用于替换传入变量的字符,例如: #define whole_operation(n) do { printf( ...
- CefSharp 初用遇到的一些问题及解决方法
之前用WebBrowser,打开网页很卡,但因为并是太要求速度和体验,所以可以显示html就可以了.但是,现在要求显示速度,最主要问题是WebBrowser控件的UserAgent,其实并不完全是IE ...
- C#读写锁ReaderWriterLockSlim的使用
读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁.在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能. 某些场合下,对 ...
- owin,webapi中将文件写入到response stream中
首先在controller项目中添加一个类: using System; using System.Collections.Generic; using System.IO; using System ...
- 01 Linux入门介绍
一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以及游戏支持度不足 L ...
- Python的第七天
面向对象编程: 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任 ...
- PHPCMS v9 超级安全防范教程!
一.目录权限设置很重要:可以有效防范黑客上传木马文件.如果通过 chmod 644 * -R 的话,php文件就没有权限访问了.如果通过chmod 755 * -R 的话,php文件的权限就高了. 所 ...
- 转I2s
转自http://blog.csdn.net/ce123/article/details/6919954 I2S音频总线学习(二)I2S总线协议 一.I2S总线概述 音响数据的采集.处理和传输是多媒体 ...
- 尝试打开或创建物理文件 REATE FILE 遇到操作系统错误 5(拒绝访问)
尝试打开或创建物理文件 'E:\Library.mdf' 时,CREATE FILE 遇到操作系统错误 5(拒绝访问.). 最佳回答: 这是因为SQL Server的启动帐户(一般是system或某个 ...
- Laravel学习笔记(三)数据库 数据库迁移
该章节内容翻译自<Database Migration using Laravel>,一切版权为原作者. 原作者:Stable Host, LLC 翻译作者:Bowen Huang 正文: ...