• Ninject之旅之六:Ninject约定


    摘要

    在小的应用系统中一个一个注册一些服务类型不怎么困难。但是,如果是一个实际的有上百个服务的应用程序呢?约定配置允许我们使用约定绑定一组服务,而不用一个一个分别绑定。

    要使用约定配置,需要添加Ninject Convention扩展的引用。可以使用NuGet安装Ninject.Extensions.Conventions或者从GitHub上下载二进制文件。

    注册一个约定绑定至少需要下面三个步骤:

    1. 选择包含具体类的程序集。

    2. 选择程序集中的具体组件。

    3. 选择具体组件相关的服务类型。

    1、选择程序集

    注册约定的第一步是得到组件类型的程序集。可以是当前程序集也可以是外部程序集。

    下面的方法用来得到程序集:

    • FromThisAssembly(): 选择包含当前代码的程序集。
    • From(params Assembly[] assemblies): 选择指定程序集。
    • FromAssemblyContaining<SomeType>(): 选择包含指定类的程序集。

    有时候不是所有的组件都在同一个程序集里,Join语法可以选择多个程序集:

    1 kernel.Bind(x => x
    2 .FromAssemblyContaining<CustomersService>()
    3 .SelectAllClasses()
    4 .Join
    5 .FromAssemblyContaining<MessageProvider>()
    6 .SelectAllClasses()
    7 .BindAllInterfaces());

    大概地说,只有公有类型才可以在程序集里被绑定。为了包含非公有类型,需要在选择程序集后用IncludingNonePublicTypes方法显示声明:

    1 .FromAssemblyContaining<CustomersService>()
    2 .IncludingNonePublicTypes()
    3 .SelectAllClasses()
    4 .BindAllInterfaces());

    2、选择组件

    第二步是选择将要注册的组件。可以使用SelectAllClasses方法选择所有的非抽象类,也可以使用Select(Func<Type, bool> filter)方法选择所需要的类。下面的例子选择所有名字以"Customer"开头的所有类。

    1 kernel.Bind(r => r
    2 .FromThisAssembly()
    3 .Select(t =>t.Name.StartsWith("Customer"))
    4 .BindBase());

    不是必须选择程序集中的所有类。可以用条件对结果进行过滤。下面的例子选择那些在基础类型在名称空间"Northwind.Controllers"里的类。

    1 kernel.Bind(x => x
    2 .FromThisAssembly()
    3 .SelectAllClasses()
    4 .InNamespaces("Northwind.Controllers")
    5 .BindBase());

    也可以使用Exclude方法和Include方法对结果进行过滤得到最终需要的组件列表。

    3、选择服务类型
    既然选择了具体组件,我们应该选择他们对应的绑定服务类型。可以使用下面的方法指定每一个组件的服务类型:

    • BindAllInterfaces(): 绑定所有的选择的组件的接口到选择的组件。
    • BindBase(): 绑定选择的组件的基类型到当前的组件。
    • BindDefaultInterface(): 绑定指定类型的默认接口到类型。类型的默认接口跟类型同名。例如,ICustomerService是CutomerService的默认接口。
    • BindDefaultInterfaces(): 绑定指定类型的默认接口到类型。类型的默认接口是那些以类型的名字结尾的接口。例如,IRepository和ICustomerRepository都是SqlCustomerRepository的默认接口。
    • BindSingleInterface(): 要求指定类型只有一个接口。在这个情况下,这个接口绑定到这个类型。如果这个类型没有或者有多个接口,则不添加绑定。
    • BindToSelf(): 绑定类型到自身。
    • BindSelection(ServiceSelector selector): 绑定选择的接口到类型。
    • BindUsingRegex(string pattern): 绑定当前类型的符合正则表达式的接口到类型。
    4、绑定配置

    绑定创建后,可以像普通绑定的配置一样进行配置:

    1 kernel.Bind(x => x
    2 .FromThisAssembly()
    3 .SelectAllClasses()
    4 .BindAllInterfaces()
    5 .Configure(b=>b.InSingletonScope()));

    我们也可以使用ConfigureFor<T>方法对某些类型分别进行配置。下面的例子,所有的repository类在构造函数中都注入"connectionString"参数,配置成单例生命周期。SqlCustomerRepository类重载成线程生命周期:

    1 kernel.Bind(x => x
    2 .FromThisAssembly()
    3 .SelectAllClasses()
    4 .InheritedFrom<IRepository>()
    5 .BindAllInterfaces()
    6 .Configure(b =>b.InSingletonScope ()
    7 .WithConstructorArgument("connectionString", ApplicationSettings.
    8 ConnectionString))
    9 .ConfigureFor<SqlCustomerRepository>(b =>b.InThreadScope()));

     

  • 相关阅读:
    JavaScript基础
    Dao的扩展
    错题解析
    实现windows程序的数据绑定
    C#第三章
    第二章
    初始windows程序
    使用ADO.NET查询和操作数据
    使用ADO.NET访问数据库
    4.计算机层次与编程语言
  • 原文地址:https://www.cnblogs.com/uncle_danny/p/6040702.html
Copyright © 2020-2023  润新知