ABP开发教程(8)

2019-01-26 16:14

ABP Framework入门开发指南

public class PersonAppService {

public ILogger Logger { get; set; }

private IPersonRepository _personRepository;

public PersonAppService(IPersonRepository personRepository) {

_personRepository = personRepository; Logger = NullLogger.Instance; }

public void CreatePerson(string name, int age) {

Logger.Debug(\ var person = new Person { Name = name, Age = age }; _personRepository.Insert(person); Logger.Debug(\ } }

IPersonRepository从构造函数注入,ILogger实例从公共属性注入。这样,你的代码不会体现依赖注入系统。这是使用DI系统最适当的方式。

(7)IIocResolver 和 IIocManager接口

有时你可能需要直接创建你的依赖项,而不是构造函数和属性注入。应该尽可能避免这种情况,但它可能无法避免。Abp提供一些服务使得这样的注入很容易实现。例子:

public class MySampleClass : ITransientDependency {

private readonly IIocResolver _iocResolver;

public MySampleClass(IIocResolver iocResolver) {

_iocResolver = iocResolver; }

ABP框架中国小组(ABPFrameWorkGroup)版权所有 | 版本:1.024

ABP Framework入门开发指南

public void DoIt() {

//Resolving, using and releasing manually

var personService1 = _iocResolver.Resolve(); personService1.CreatePerson(new CreatePersonInput { Name = \Surname = \

_iocResolver.Release(personService1);

//Resolving and using in a safe way using (var personService2 =

_iocResolver.ResolveAsDisposable()) {

personService2.Object.CreatePerson(new CreatePersonInput { Name = \ } } }

MySampleClass是一个应用程序的示例类。IIcResolver通过构造函数注入,然后用它来创建和释放对象。有几个解决方法的重载可以根据需要使用。Release方法用于释放组件(对象)。如果你是手动创建一个对象,调用Release方法释放对象非常重要。否则,你的应用程序会有内存泄漏问题。为了保证对象被释放,尽可能使用ResolveAsDisposable(就像上面的例子所示)。它会在using代码块结束的时候自动调用Release方法。

如果你想直接使用IOC容器(Castle Windsor)来处理依赖关系项,可以通过构造函数注入 IIocManager并使用它IIocManager.IocContainer 属性。如果你是在一个静态上下文或不能注入IIocManager,还有最后一个方法,你可以使用单例对象IocManager.Instance,你可以在任何地方获取到,它无处不在。但是,在这种情况下你的代码将变得不容易测试。 2.1.5 附件

(1)IShouldInitialize 接口

有些类在第一次使用前需要初始化。IShouldInitialize有Initialize()方法。如果你实现它,

ABP框架中国小组(ABPFrameWorkGroup)版权所有 | 版本:1.025

ABP Framework入门开发指南

那么你的Initialize()方法自动会被自动调用在创建对象之后(在使用之前)。当然,为了使用这个特性,你应该注入/创建此对象。

(2)ASP.NET MVC & ASP.NET Web API 集成

当然,我们必须调用依赖注入系统处理依赖关系图的根对象。在一个ASP.NET MVC应用程序,通常是一个控制器类。我们可以使用构造函数注入模式注入控制器。当一个请求来到我们的应用程序中,控制器和所有依赖项被IOC容器递归创建。所以,谁做了这些?这是被Abp扩展的ASP.NET MVC默认控制器工厂自动完成的。ASP.NET Web API 也是相似的。你不用关心对象的创建和释放。

(3)最后说明(Last notes)

Abp简化并自动使用依赖注入,只要你遵守规则和使用上面的结构。大多数时候这样就够了。但是如果不能满足你的需求,你可以直接使用Castle Windsor的所有能力来执行任何任务(如自定义注册,注入钩子,拦截器等等)。

2.2 ABP会话管理

2.2.1 简介

如果一个应用程序需要登录,则它必须知道当前用户执行了什么操作。因此ASP.NET在展示层提供了一套自己的SESSION会话对象,而ABP则提供了一个可以在任何地方获取当前用户和租户的IAbpSession接口。

注意:

关于IAbpSession接口:需要获取会话信息则必须实现IAbpSession接口。虽然你可以用自己的方式去实现它(IAbpSession),但是它在module-zero项目中已经有了完整的实现。

需要获取会话信息则必须实现IAbpSession接口。虽然你可以用自己的方式去实现它(IAbpSession),但是它在module-zero项目中已经有了完整的实现。

ABP框架中国小组(ABPFrameWorkGroup)版权所有 | 版本:1.026

ABP Framework入门开发指南

2.2.2 注入会话

IAbpSession通常是以属性注入的方式存在于需要它的类中,不需要获取会话信息的类中则不需要它。如果我们使用属性注入方式,我们可以用NullAbpSession.Instance作为默认值来初始化它(IAbpSession),如下所示:

public class MyClass : ITransientDependency {

public IAbpSession AbpSession { get; set; }

public MyClass() {

AbpSession = NullAbpSession.Instance; }

public void MyMethod() {

var currentUserId = AbpSession.UserId; //... } }

由于授权是应用层的任务,因此我们应该在应用层和应用层的上一层使用IAbpSession(我们不在领域层使用IAbpSession是很正常的)。

ApplicationService, AbpController 和 AbpApiController 这3个基类已经注入了AbpSession属性,因此在Application Service的实例方法中,能直接使用AbpSession属性。

2.2.3 使用会话属性

AbpSession定义的一些关键属性:

? UserId: 当前用户的标识ID,如果没有当前用户则为null.如果需要授权访问则它不

可能为空。

? TenantId: 当前租户的标识ID,如果没有当前租户则为null。

ABP框架中国小组(ABPFrameWorkGroup)版权所有 | 版本:1.027

ABP Framework入门开发指南

? MultiTenancySide: 可能是Host或Tenant。

UserId和TenantId是可以为null的。当然也提供了不为空时获取数据的 GetUserId()和GetTenantId() 方法。当你确定有当前用户时,你可以使用 GetUserId()方法。

如果当前用户为空,使用该方法则会抛出一个异常。GetTenantId()的使用方式和GetUserId()类似。

2.3 ABP日志管理

2.3.1 服务器端

ABP使用Castle Windsor's logging facility日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等。对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方便的处理各种特殊的日志库,而且当业务需要的时候,很容易替换日志组件。

译者注:

Castle是什么?Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西。ASP.NET Boilerplate的ioc容器就是通过Castle实现的。

Log4Net是asp.net下面最流行的一个日志库组件, ASP.NET Boilerplate 模板也使用了Log4Net日志库组件,但是呢,我们这里仅仅通过一行关键代码就实现Log4Net 的依赖注入(具体说明在下面的配置文件),所以,如果你想替换成自己的日志组件,也很容易。

(1)获取日志记录器(logger)

不管你选择哪一个日志库组件,通过代码来进行日志记录都是一样的。(这里吐槽, Castle's 通用 ILogger 接口实在太牛逼了)。

下面进入正题:(注:下面的代码是abp框架的Castle.Core源码分析以及实现) 首先呢,我们要先处理日志记录器对象logger, ASP.NET Boilerplate框架使用了dependency injection依赖注入技术,我们可以很方便的使用依赖注入生成日志记录器对象logger。

ABP框架中国小组(ABPFrameWorkGroup)版权所有 | 版本:1.028


ABP开发教程(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2016年黑龙江造价工程师土建计量:混凝土搅拌考试试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: