abp学习(二)

翻译下首页截图的标签:

 

DDD Base Classes

介绍:

应用程序代码库的分层是一种被广泛接受的技术,可帮助降低复杂性并提高代码重用性。为了实现分层架构,ASP.NET样板遵循域驱动设计的原则。

Domain Driven Design Layers

域驱动设计 (DDD) 中有四个基本层:
表示层:为用户提供接口。使用应用程序层实现用户交互。
应用程序层:在演示文稿层和域层之间起中介作用。协调业务对象以执行特定的应用程序任务。
领域层:包括业务对象及其规则。这是应用程序的核心。
基础设施层:提供通用技术功能,主要使用第三方库支持更高层。

总结:可以点进去看,这里只写了很少的一部分,具体页面还要一个很大的图片,并且配有讲解。

Repositories

存储库模式"使用类似于集合的接口访问域对象,在域和数据映射层之间进行中介"(马丁·福勒)。

实际上,存储库用于对域对象(实体和值类型)执行数据库操作。通常,每个实体(或聚合根)都使用单独的存储库。

在ASP.NET样板,仓库类实现IRepository<TEntity, TPrimaryKey> interface。ABP可以自动创建为每个实体类型的默认库。

您可以直接 inject IRepository<TEntity> (or IRepository<TEntity, TPrimaryKey>).一个示例应用服务使用的存储库中插入一个实体到数据库:

地址:https://aspnetboilerplate.com/Pages/Documents/Repositories

总结具体请看页面,演示了怎么使用,和自定义仓库(Repositories)

Dependency Injection

What is Dependency Injection?

如果您已经知道依赖项注入、构造函数和属性注入模式概念,则可以跳到下一节。

维基百科说:"依赖注入是一种软件设计模式,其中一个或多个依赖项(或服务)被注入或通过引用传递到从属对象(或客户端),并构成客户端状态的一部分。该模式将客户端依赖项的创建与其自己的行为分开,从而允许程序设计松散耦合,并遵循依赖项反转和单一责任原则。它直接对比服务定位器模式,它允许客户端了解他们用来查找依赖项的系统。

不使用依赖项注入技术,很难管理依赖项和开发模块化且结构良好的应用程序。

Problems of the Traditional Way(传统方式的问题)

在应用程序中,类彼此依赖。假设我们有一个应用程序服务,它使用存储库将实体插入到数据库中。在此情况下,应用程序服务类依赖于存储库类。请参阅以下示例:

详情地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection

总结:这里面介绍了很多,具体可以到网页查看。

Authorization(授权认证)

几乎所有企业应用程序都在某个级别使用授权。授权用于检查是否允许用户在应用程序中执行某些特定操作。ASP.NET Boilerplate定义了基于权限的基础结构来实现授权。

About IPermissionChecker

授权系统使用IPermissionChecker来检查权限。虽然可以用自己的方式实现它,但已在Module Zero项目中完全实现了它。如果未实现,则使用NullPermissionChecker,它将所有权限授予所有人。

定义权限 为每个需要授权的操作定义了唯一权限。我们需要先定义权限,然后再使用它。 ASP.NET Boilerplate设计为模块化的,因此不同的模块可以具有不同的权限。模块应该创建一个从AuthorizationProvider派生的类,以定义其权限。授权提供者示例如下所示:

地址:https://aspnetboilerplate.com/Pages/Documents/Authorization

总结:详情看原文,只翻译了开头,具体内容需要到页面查看。

感觉这个权限实现的不好用………………

Connection & Transaction Management in ASP.NET Boilerplate(ASP.NET样板中的连接和事务管理)

Introduction

连接和事务管理是使用数据库的应用程序中最重要的概念之一。您需要知道何时打开连接,何时启动事务以及如何处置连接,等等。...ASP.NET Boilerplate通过使用其工作单元系统来管理数据库连接和事务。

ASP.NET Boilerplate打开一个数据库连接(根据ORM提供程序的实现,它可能不会立即打开,而是在第一次使用数据库时打开),并在输入工作单位方法时开始事务。您可以通过这种方法安全地使用连接。在该方法结束时,将提交事务并处置连接。如果该方法引发异常,则将回滚事务,并释放连接。这样,工作单元方法就是原子的(工作单元)。 ASP.NET Boilerplate自动完成所有这些操作。

如果一个工作单元方法调用另一个工作单元方法,则两者都使用相同的连接和事务。首先输入的方法管理连接和事务,然后其他方法重新使用它。

如果未配置,则工作单元的默认IsolationLevel为ReadUncommitted。使用工作单位选项可以轻松配置它。

Conventional Unit Of Work Methods

默认情况下,某些方法是工作单元方法:

All MVC, Web API and ASP.NET Core MVC Controller actions.

All Application Service methods.

All Repository methods.

Assume that we have an application service method like the one below:

地址:https://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work

总结:事务是很重要的一部分内容,详情到具体页面查看。

事务虽然复杂,但是一般框架使用起来都比较简单(非分布式事务)java的spring框架中使用事务就很简单,加上一个注解就可以了。

Auto  Validation

Introduction to validation(验证简介)

在应用程序中,应首先验证输入。输入可以由用户或其他应用程序发送。在Web应用程序中,验证通常执行两次:在客户端和服务器端。客户端验证主要是为了用户体验而实施的。最好先在客户端中检查表单,然后向用户显示无效字段。但是,服务器端验证是不可避免的,并且更为关键。

服务器端验证通常在应用程序服务或控制器中实现(通常,所有服务都从表示层获取数据)。应用程序服务方法应首先检查(验证)输入,然后再使用它。 ASP.NET Boilerplate提供了用于自动验证以下应用程序输入的基础结构:

All application service methods

All ASP.NET Core MVC controller actions

All ASP.NET MVC and Web API controller actions.

如果需要,请参见“禁用验证”部分以禁用验证。

Using data annotations(使用数据注解)

ASP.NET Boilerplate支持数据注释属性。假设我们正在开发一个Task应用程序服务,该服务将在任务获得输入时用于创建任务,如下所示:

地址:https://aspnetboilerplate.com/Pages/Documents/Validating-Data-Transfer-Objects

总结:具体内容查看详情页面,这一部分的功能属于基础功能,必须了解熟悉。

Auto audit  Logging

Introduction

维基百科:“审核跟踪(也称为审核日志)是与安全性相关的时间顺序记录,记录集和/或记录的目的地和记录源,它们提供文件证据来证明特定操作在任何时间都受到影响的活动顺序。 ,过程或事件”。

ASP.NET Boilerplate提供了自动记录应用程序内所有交互的基础结构。它可以记录带有调用者信息和参数的预期方法调用。

基本上,保存的字段包括:相关的租户ID,呼叫者用户ID,服务名称(被调用方法的类),方法名称,执行参数(序列化为JSON),执行时间,执行持续时间(以毫秒为单位),客户端的IP地址,客户端的计算机名称和异常(如果该方法引发异常)。

有了这些信息,我们不仅知道谁进行了操作,而且还可以评估应用程序的性能并观察抛出的异常。此外,您可以获取有关应用程序使用情况的统计信息。

审核系统使用IAbpSession来获取当前的UserId和TenantId。

默认情况下,将自动审核应用程序服务,MVC控制器,Web API和ASP.NET Core方法。

The Application Service, MVC Controller, Web API and ASP.NET Core methods are automatically audited by default.

关于IAuditingStore 审核系统使用IAuditingStore保存审核信息。虽然可以用自己的方式实现它,但已在Module Zero项目中完全实现了它。如果未实现,则使用SimpleLogAuditingStore并将审核信息写入日志。

Configuration

若要配置审核,可以使用模块的PreInitialize方法中的Configuration.Auditing属性。默认情况下启用审核。您可以如下所示禁用它:

地址:https://aspnetboilerplate.com/Pages/Documents/Audit-Logging

总结:具体查看详情页面,日志是一个系统的基础部分,只要开始正式使用,多多少少肯定是要有日志的,日志是系统走向正规的必由之路。

Logging

服务器端 ASP.NET Boilerplate使用Castle Windsor的日志记录工具。它可以与不同的日志库一起使用:Log4Net,NLog,Serilog等。 Castle为所有记录器库提供了通用接口。这样,您就可以独立于特定的日志记录库,以后可以根据需要轻松地对其进行更改。

Log4Net是.NET最受欢迎的日志记录库之一。 ASP.NET Boilerplate模板随Log4Net一起正确配置并可以使用。仅存在一行与log4net依赖的代码(如配置部分所示),因此您可以轻松地将其更改为您喜欢的库。

Getting The Logger(获取日志记录器)

不管您选择哪个日志库,编写日志的代码都是相同的(这要感谢Castle的通用ILogger接口)。

首先,我们需要获取一个Logger对象来编写日志。由于ASP.NET Boilerplate强烈使用依赖项注入,因此我们可以使用属性注入(或构造函数注入)模式轻松注入Logger对象。这是一个写日志行的示例类:

using Castle.Core.Logging; //1: Import Logging namespace

public class TaskAppService : ITaskAppService
{    
    //2: Getting a logger using property injection
    public ILogger Logger { get; set; }

    public TaskAppService()
    {
        //3: Do not write logs if no Logger supplied.
        Logger = NullLogger.Instance;
    }

    public void CreateTask(CreateTaskInput input)
    {
        //4: Write logs
        Logger.Info("Creating a new task with description: " + input.Description);

        //TODO: save task to database...
    }
}

地址:https://aspnetboilerplate.com/Pages/Documents/Logging

总结:具体查看详情页面,这个是系统的日志,上一个是输入验证日志;

Exception Management

Introduction

本文档适用于ASP.NET MVC和Web API。如果您对ASP.NET Core感兴趣,请参阅ASP.NET Core文档。

在Web应用程序中,通常在MVC Controller和Web API Controller操作中处理异常。发生异常时,会向应用程序用户通知该错误以及可选原因。

如果常规HTTP请求中发生错误,则会显示错误页面。如果AJAX请求中发生错误,则服务器将错误信息发送给客户端,然后客户端处理并显示给用户。

处理所有Web请求中的异常很繁琐,并且很难保持DRY。 ASP.NET Boilerplate使此过程自动化。您几乎不需要显式处理异常。 ASP.NET Boilerplate处理所有异常,记录它们,然后将适当的格式化响应返回给客户端。它还在客户端中处理这些响应,并向用户显示错误消息。

Enabling Error Handling(启用错误处理)

若要为ASP.NET MVC控制器启用错误处理,必须为ASP.NET MVC应用程序启用customErrors模式。

<customErrors mode="On" />

例如,如果您不想处理本地计算机上的错误,它也可以是“ RemoteOnly”。请注意,这仅对于ASP.NET MVC控制器是必需的,而对于Web API控制器则不是必需的。

如果您已经在全局过滤器中处理异常,则它可能会隐藏异常。因此,ABP的异常处理可能无法按预期工作。因此,如果执行此操作,请小心操作!

Non-Ajax Requests(非ajax请求)

如果请求不是AJAX,则会显示错误页面。

Showing Exceptions(显示异常)

想象一下,有一个MVC控制器动作会抛出一个任意异常:

public ActionResult Index()
{
    throw new Exception("A sample exception message...");
}

最有可能的是,此操作将调用另一种方法引发此异常。 ASP.NET Boilerplate处理此异常,记录该异常并显示“ Error.cshtml”视图。您可以自定义此视图以显示错误。这是一个示例错误视图(ASP.NET Boilerplate模板中的默认“错误”视图):

除非您明确抛出UserFriendlyException,否则ASP.NET Boilerplate会向用户隐藏该异常的详细信息并显示标准(且可本地化)错误消息。

UserFriendlyException

UserFriendlyException是一种特殊类型的异常,直接显示给用户。请参见下面的示例代码:

public ActionResult Index()
{
    throw new UserFriendlyException("Ooppps! There is a problem!", "You are trying to see a product that is deleted...");
}

ASP.NET Boilerplate将其记录下来,并且不会隐藏异常:

 如果要向用户显示特殊错误消息,只需抛出UserFriendlyException(或从中派生的异常)即可。

 地址:https://aspnetboilerplate.com/Pages/Documents/Handling-Exceptions

总结:详细信息,请查看具体页面。异常处理的统一性比较困难,这一点可以好好学习下。

Localization(本地化)

Introduction

开发适用于全球的应用程序,包括可以本地化为一种或多种语言的应用程序,需要本地化功能。 ASP.NET Boilerplate为开发面向世界的本地化应用程序提供了广泛的支持。

Application Languages

首先要做的是声明支持哪些语言。这是在模块的PreInitialize方法中完成的,如下所示:

Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flags gb", true));
Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flags tr"));

在服务器端,您可以注入并使用ILocalizationManager。在客户端,您可以使用abp.localization JavaScript API来获取所有可用语言以及当前语言的列表。 “ famfamfam-flags gb”(和“ famfamfam-flags tr”)只是一个CSS类,您可以根据需要进行更改。然后,您可以在UI中使用它来显示相关标志。

ASP.NET Boilerplate模板使用此系统向用户显示语言切换组合框。创建一个模板,并查看源代码以获取更多信息。

Localization Sources(本地化资源)

本地化文本可以存储在不同的源中。您甚至可以在同一应用程序中使用多个源(如果您有多个模块,则每个模块可以定义一个单独的本地化源,或者一个模块可以定义多个源)。 ILocalizationSource接口应由本地化源实现。然后将其注册到ASP.NET Boilerplate的本地化配置。

每个本地化源必须具有唯一的源名称。有预定义的本地化源类型,如下所示。

XML Files

本地化文本可以存储在XML文件中。 XML文件的内容如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<localizationDictionary culture="en">
  <texts>
    <text name="TaskSystem" value="Task System" />
    <text name="TaskList" value="Task List" />
    <text name="NewTask" value="New Task" />
    <text name="Xtasks" value="{0} tasks" />
    <text name="CompletedTasks" value="Completed tasks" />
    <text name="EmailWelcomeMessage">Hi,
Welcome to Simple Task System! This is a sample
email content.</text>
  </texts>
</localizationDictionary>

XML文件必须是unicode(utf-8)。 culture =“ en”声明此XML文件包含英语文本。对于文本节点; name属性用于标识文本。您可以使用value属性或内部文本(如最后一个)来设置本地化文本的值。我们为每种语言创建一个单独的XML文件,如下所示:

 SimpleTaskSystem是此处的源名称,而SimpleTaskSystem.xml定义了默认语言。当请求文本时,ASP.NET Boilerplate从当前语言的XML文件中获取文本(它使用Thread.CurrentThread.CurrentUICulture查找当前语言)。如果当前语言不存在,它将从默认语言的XML文件中获取文本。

Registering XML Localization Sources(注册xml本地化资源)

 XML文件可以存储在文件系统中,也可以嵌入到程序集中。

对于文件系统存储的XML,我们可以注册XML本地化源,如下所示:

Configuration.Localization.Sources.Add(
    new DictionaryBasedLocalizationSource(
        "SimpleTaskSystem",
        new XmlFileLocalizationDictionaryProvider(
            HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem")
            )
        )
    );

这是在模块的PreInitialize事件中完成的(有关更多信息,请参见模块系统)。 ASP.NET Boilerplate在给定目录中找到所有XML文件,并注册本地化源。

对于嵌入式XML文件,我们必须将所有本地化XML文件标记为嵌入式资源(选择XML文件,打开属性窗口(F4),并将“构建操作”更改为“嵌入式资源”)。然后我们可以注册本地化源,如下所示:

Configuration.Localization.Sources.Add(
    new DictionaryBasedLocalizationSource(
        "SimpleTaskSystem",
        new XmlEmbeddedFileLocalizationDictionaryProvider(
            Assembly.GetExecutingAssembly(),
            "MyCompany.MyProject.Localization.Sources"
            )
        )
    );

地址:https://aspnetboilerplate.com/Pages/Documents/Localization

总结:详细信息请,查看具体页面。本地化之前做过一次,都是写死的,也是读取xml文件。这里可以学习下abp的解决方案。

Object To Object Mapping

Introduction

将相似的对象映射到另一个对象是很常见的。因为通常两个对象(类)可能具有彼此映射的相同/相似属性,所以它也是繁琐且重复的。想象一下下面的典型应用程序服务方法:

public class UserAppService : ApplicationService
{
    private readonly IRepository<User> _userRepository;

    public UserAppService(IRepository<User> userRepository)
    {
        _userRepository = userRepository;
    }

    public void CreateUser(CreateUserInput input)
    {
        var user = new User
        {
            Name = input.Name,
            Surname = input.Surname,
            EmailAddress = input.EmailAddress,
            Password = input.Password
        };

        _userRepository.Insert(user);
    }
}

CreateUserInput是一个简单的DTO类,而User是一个简单的实体。我们根据给定的输入手动创建了一个User实体。用户实体在实际应用程序中将具有更多属性,而手动创建它会变得乏味且容易出错。要向User和CreateUserInput添加新属性时,我们还必须更改映射代码。

我们可以使用一个库来自动处理我们的映射。 AutoMapper是用于对象到对象映射的最佳库之一。 ASP.NET Boilerplate定义了一个IObjectMapper接口以对其进行抽象,然后使用Abp.AutoMapper包中的AutoMapper实现此接口。

IObjectMapper Interface

IObjectMapper是一个简单的抽象,具有用于将一个对象映射到另一个对象的Map方法。我们可以将上面的代码替换为:

public class UserAppService : ApplicationService
{
    private readonly IRepository<User> _userRepository;
    private readonly IObjectMapper _objectMapper;

    public UserAppService(IRepository<User> userRepository, IObjectMapper objectMapper)
    {
        _userRepository = userRepository;
        _objectMapper = objectMapper;
    }

    public void CreateUser(CreateUserInput input)
    {
        var user = _objectMapper.Map<User>(input);
        _userRepository.Insert(user);
    }
}

Map是获取源对象并创建一个新的目标对象的简单方法,该对象的类型声明为通用参数(此示例中为User)。 Map方法具有将对象映射到现有对象的重载。假设我们已经有一个User实体,并想使用一个对象来更新它的属性:

public void UpdateUser(UpdateUserInput input)
{
    var user = _userRepository.Get(input.Id);
    _objectMapper.Map(input, user);
}

AutoMapper Integration(AutoMapper 集成)

Abp.AutoMapper NuGet程序包(模块)实现IObjectMapper并提供其他功能。

Installation

首先,将Abp.AutoMapper NuGet软件包安装到您的项目中:

Install-Package Abp.AutoMapper

然后将AbpAutoMapperModule的依赖项添加到模块定义类中:

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyModule : AbpModule
{
    ...
}

然后,您可以安全地在代码中注入并使用IObjectMapper。您还可以在需要时使用AutoMapper自己的API。

Creating Mappings

在使用映射之前,AutoMapper要求您定义类之间的映射(默认情况下)。您可以查看AutoMapper自己的文档以获取有关映射的详细信息。 ASP.NET Boilerplate使它变得更加简单和模块化。

Auto Mapping Attributes(自动映射属性)

大多数时候,您可能只想直接(和传统上)映射类。在这种情况下,可以使用AutoMap,AutoMapFrom和AutoMapTo属性。例如,如果要将上面的示例中的CreateUserInput类映射到User类,则可以使用AutoMapTo属性,如下所示:

[AutoMapTo(typeof(User))]
public class CreateUserInput
{
    public string Name { get; set; }

    public string Surname { get; set; }

    public string EmailAddress { get; set; }

    public string Password { get; set; }
}

AutoMap属性在两个方向上映射两个类。但是在此示例中,我们仅需要从CreateUserInput映射到User,因此我们使用了AutoMapTo

Custom Mapping(自定义映射)

在某些情况下,简单映射可能不合适。例如,两个类的属性名称可能略有不同,或者您可能希望在映射过程中忽略某些属性。在这种情况下,您应该直接使用AutoMapper的API定义映射。 Abp.AutoMapper包定义了一个API,以使自定义映射更加模块化。

假设我们要忽略映射时的密码,并且用户具有稍微不同的命名电子邮件属性。我们可以如下定义映射:

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyModule : AbpModule
{
    public override void PreInitialize()
    {
        Configuration.Modules.AbpAutoMapper().Configurators.Add(config =>
        {
            config.CreateMap<CreateUserInput, User>()
                  .ForMember(u => u.Password, options => options.Ignore())
                  .ForMember(u => u.Email, options => options.MapFrom(input => input.EmailAddress));
        });
    }
}

AutoMapper具有更多的对象间映射选项和功能。有关更多信息,请参见其文档。

地址:https://aspnetboilerplate.com/Pages/Documents/Object-To-Object-Mapping

总结:其他详细信息,请查看具体页面。

全文总结:

只是简单翻译了官网每个标签的很小一部分内容。具体还需要自己去官网一个主题一个主题看。

可以挑选一些重要的主题先看,然后先看基本部分,然后再具体深入;

然后扩大到其他主题,然后深入具体部分,然后扩展到细节部分;

abp内容很庞大,只能先学个大概了。

原文地址:https://www.cnblogs.com/Tpf386/p/11837604.html