日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

基于DDD的.NET开发框架 - ABP依赖注入

發(fā)布時間:2025/3/15 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于DDD的.NET开发框架 - ABP依赖注入 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

返回ABP系列

ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。

ASP.NET Boilerplate是一個用最佳實踐和流行技術開發(fā)現(xiàn)代WEB應用程序的新起點,它旨在成為一個通用的WEB應用程序框架和項目模板。

ABP的官方網(wǎng)站:http://www.aspnetboilerplate.com

ABP官方文檔:http://www.aspnetboilerplate.com/Pages/Documents

Github上的開源項目:https://github.com/aspnetboilerplate

一、依賴注入概念

控制反轉(zhuǎn)(Inversion of Control,英文縮寫為IoC)是一個重要的面向?qū)ο缶幊痰姆▌t來削減計算機程序的耦合問題,也是輕量級的Spring框架的核心。 控制反轉(zhuǎn)一般分為兩種類型,依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。依賴注入應用比較廣泛。

依賴注入是一種軟件設計模式的一個或多個依賴項注入(或服務),或通過引用傳遞,為依賴對象(或客戶)和客戶端狀態(tài)的一部分。模式之間建立一個客戶的依賴關系的行為,它允許程序設計是松散耦合的,依賴倒置和單一職責原則。它直接對比service locator模式,它允許客戶了解他們所使用的系統(tǒng)找到依賴。

依賴注入不是目的,它是一系列工具和手段,最終的目的是幫助我們開發(fā)出松散耦合、可維護、可測試的代碼和程序。這條原則的做法是大家熟知的面向接口,或者說是面向抽象編程。

理想的軟件開發(fā)設計是“高內(nèi)聚,低耦合”,高內(nèi)聚側(cè)重面向?qū)ο缶幊?#xff0c;低耦合側(cè)重面向接口編程,控制反轉(zhuǎn)、依賴注入、依賴倒置都蘊含著面向接口編程的思想。

控制反轉(zhuǎn)把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權交給容器,通過容器來實現(xiàn)對象組件的裝配和管理。所謂的"控制反轉(zhuǎn)"概念就是對組件對象控制權的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。

依賴注入是通過反射(reflection)動態(tài)的向某個對象提供它所需要的其他對象、

常用依賴注入框架:

Unity:微軟patterns&practicest團隊開發(fā)的IOC依賴注入框架,支持AOP橫切關注點。

MEF(Managed Extensibility Framework):是一個用來擴展.NET應用程序的框架,可開發(fā)插件系統(tǒng)。

Spring.NET:依賴注入、面向方面編程(AOP)、數(shù)據(jù)訪問抽象,、以及ASP.NET集成。

Autofac:最流行的依賴注入和IOC框架,輕量且高性能,對項目代碼幾乎無任何侵入性。

PostSharp:實現(xiàn)靜態(tài)AOP橫切關注點,使用簡單,功能強大,對目標攔截的方法無需任何改動。

Castle Windsor、StructureMap、Ninject

其實我感覺Autofac挺好用的,一直用的Autofac,不知道到Castle Windsor怎么樣。

二、三層和DDD分層依賴關系

1、三層分層依賴如下圖:

從引用關系我們就能知道各層的依賴關系:BLL需要依賴DAL,因為BLL中用到了DAL層的實體。UI這一層需要依賴BLL,還需要依賴DAL,因為在UI中也用到了DAL層實體。

如果從換個數(shù)據(jù)庫,DAL需要修改,那DAL的依賴也需要修改。

2、DDD分層依賴關系圖

從上圖可以知道,表現(xiàn)層和數(shù)據(jù)訪問層都依賴領域模型層,這樣的話,如果我們新添加一個UI界面;更換一種數(shù)據(jù)源的存儲和獲取方式,只需要修改對應層的代碼即可,領域模型層保持了穩(wěn)定。

減少new引入的依賴及緊耦合最好的方式是使用構(gòu)造函數(shù)注入依賴這種設計模式:即如果我們需要一個依賴的實例,通過構(gòu)造函數(shù)注入。

解耦和最重要的原則就是依賴倒置原則:

高層模塊不應該依賴底層模塊,他們都應該依賴抽象。抽象不應該依賴于細節(jié),細節(jié)應該依賴于抽象。

簡單理解就是組件應該依賴于接口而不是實現(xiàn)。

三、ABP依賴注入底層實現(xiàn)

ABP依賴注入是通過Castle Windsor依賴注入的框架實現(xiàn)。

1、通過實現(xiàn)IConventionalDependencyRegistrar的實例定義注入的約定,然后通過IocManager來讀取這個規(guī)則完成依賴注入

代碼在Abp項目文件的Dependency文件夾下

?1)在PreInitialize方法中給IocManager的IConventionalDependencyRegistrar的list中加入BasicConventionalRegistrar

IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());

2)IocManager維護了一個叫_conventionalRegistrars的list,其中的元素類型就是IConventionalDependencyRegistrar。接著IocManager的RegisterAssemblyByConvention是在模塊的Initialize方法中被調(diào)用

public override void Initialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); }

3)IocManager在RegisterAssemblyByConvention方法中遍歷這個list,并根據(jù)IConventionalDependencyRegistrar的實例中定義的規(guī)則來完成register。

/// <summary>/// Registers types of given assembly by all conventional registrars. See <see cref="AddConventionalRegistrar"/> method./// </summary>/// <param name="assembly">Assembly to register</param>public void RegisterAssemblyByConvention(Assembly assembly){RegisterAssemblyByConvention(assembly, new ConventionalRegistrationConfig());}/// <summary>/// Registers types of given assembly by all conventional registrars. See <see cref="AddConventionalRegistrar"/> method./// </summary>/// <param name="assembly">Assembly to register</param>/// <param name="config">Additional configuration</param>public void RegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config){var context = new ConventionalRegistrationContext(assembly, this, config);foreach (var registerer in _conventionalRegistrars){registerer.RegisterAssembly(context);}if (config.InstallInstallers){IocContainer.Install(FromAssembly.Instance(assembly));}}

?

2、直接使用IocManager的Register方法直接完成注入

AbpModule有個受保護的IocManager的成員,所以AbpModule的派生類都可以使用這個IocManager完成注冊。

public class AbpWebModule : AbpModule{/// <inheritdoc/>public override void PreInitialize(){if (HttpContext.Current != null){XmlLocalizationSource.RootDirectoryOfApplication = HttpContext.Current.Server.MapPath("~");}//IocManager直接注入IocManager.Register<IAbpWebModuleConfiguration, AbpWebModuleConfiguration>();Configuration.Localization.Sources.Add(new DictionaryBasedLocalizationSource(AbpWebLocalizedMessages.SourceName,new XmlEmbeddedFileLocalizationDictionaryProvider(Assembly.GetExecutingAssembly(), "Abp.Web.Localization.AbpWebXmlSource")));}/// <inheritdoc/>public override void Initialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); }}

?

總結(jié)

以上是生活随笔為你收集整理的基于DDD的.NET开发框架 - ABP依赖注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。