zoukankan      html  css  js  c++  java
  • 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. 创建接口和类

     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. 编译程序,在binDebug文件夹下找到应用程序的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");
  • 相关阅读:
    [ES6] for..in && for..of
    [Falcor] Building Paths Programmatically
    [Polymer] Custom Elements: Styling
    [Polymer] Introduction
    [Redux] Implementing combineReducers() from Scratch
    [Redux] Reducer Composition with combineReducers()
    [AngularJS] Exploring the Angular 1.5 .component() method
    生物-脑-脑容量:脑容量
    生物学-脑:脑(动物中枢神经系统主要部分)
    生物:生物
  • 原文地址:https://www.cnblogs.com/uncle_danny/p/5918017.html
Copyright © 2011-2022 走看看