国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

ABP框架的基礎(chǔ)配置及依賴注入講解

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:37:13
文檔

ABP框架的基礎(chǔ)配置及依賴注入講解

ABP框架的基礎(chǔ)配置及依賴注入講解:配置ABP 配置是通過在自己模塊的PreInitialize方法中來實(shí)現(xiàn)的 代碼示例如下: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //在你的應(yīng)用中添加語言包,這個(gè)是英語和作者的土耳其語。 C
推薦度:
導(dǎo)讀ABP框架的基礎(chǔ)配置及依賴注入講解:配置ABP 配置是通過在自己模塊的PreInitialize方法中來實(shí)現(xiàn)的 代碼示例如下: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //在你的應(yīng)用中添加語言包,這個(gè)是英語和作者的土耳其語。 C

配置ABP
配置是通過在自己模塊的PreInitialize方法中來實(shí)現(xiàn)的
代碼示例如下:

public class SimpleTaskSystemModule : AbpModule
{
 public override void PreInitialize()
 {
 //在你的應(yīng)用中添加語言包,這個(gè)是英語和作者的土耳其語。
 Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true));
 Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flag-tr"));

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

 //配置導(dǎo)航和菜單
 Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>();
 }

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

和orchard類似,abp框架一開始就被設(shè)計(jì)成模塊化的,不同的模塊可以通過abp框架來進(jìn)行配置。舉個(gè)例子吧,不同的模塊都可以添加導(dǎo)航,通過導(dǎo)航添加菜單項(xiàng)到自己定義的主菜單,具體的細(xì)節(jié)大家可以參照:

本地化:http://www.aspnetboilerplate.com/Pages/Documents/Localization
導(dǎo)航:http://www.aspnetboilerplate.com/Pages/Documents/Navigation

配置模塊
和.net框架原生的啟動(dòng)配置相比較,abp有哪些不一樣呢?abp框架的模塊可以通過IAbpModuleConfigurations接口進(jìn)行個(gè)性化的擴(kuò)展,這樣的話,模塊配置更加簡(jiǎn)單、方便。
示例代碼如下:

...
using Abp.Web.Configuration;
...
public override void PreInitialize() 
{
 Configuration.Modules.AbpWeb().SendAllExceptionsToClients = true;
}
...

在上面這個(gè)例子中,我們通過配置AbpWeb模塊,發(fā)送異常到客戶端。當(dāng)然了,不是每一個(gè)模塊都需要這種配置,通常情況下我們需要,是當(dāng)一個(gè)模塊需要在多個(gè)不同的應(yīng)用中重復(fù)使用,我們才進(jìn)行這樣的配置。

為一個(gè)模塊創(chuàng)建配置
如下代碼,假如我們有一個(gè)命名為MyModule的模塊,并且這各模塊有一些自己的配置。那么我們首先要?jiǎng)?chuàng)建一些類,這些類定義為屬性(譯者注:屬性有自動(dòng)的get和set訪問器。),代表了不同的配置。

public class MyModuleConfig
{
 public bool SampleConfig1 { get; set; }

 public string SampleConfig2 { get; set; }
}

接下來,我們通過依賴注入,注冊(cè)這個(gè)類。

IocManager.Register<MyModuleConfig>(); //譯者注:在IocManager中注冊(cè)了一個(gè)類,換句話說,我們通過IocManager可以得到這個(gè)類MyModuleConfig的實(shí)例。至于IOC的原理這里就不在詳細(xì)說了,總之,就是可以得到一個(gè)類的實(shí)例。

最后,我們通過創(chuàng)建一個(gè)擴(kuò)展的方法IModuleConfigurations來得到配置的引用。如下代碼:

2016615173022790.png (920×215)

譯者注:模塊配置是一個(gè)靜態(tài)類,因?yàn)槲覀冃枰貜?fù)使用它。靜態(tài)方法Mymodule返回的是一個(gè)配置接口,參數(shù)是ImoduleConfigurations接口。

現(xiàn)在,在其他模塊中也可以配置我們自定義的這個(gè)MyModule模塊了。

Configuration.Modules.MyModule().SampleConfig1 = false;
Configuration.Modules.MyModule().SampleConfig2 = "test";

在某種意義上,MyModule需要這些配置,你能注射MyModuleConfig并且可以使用這些值。

public class MyService : ITransientDependency
{
 private readonly MyModuleConfig _configuration;

 public MyService(MyModuleConfig configuration)
 {
 _configuration = configuration;
 }

 
 public void DoIt()
 {
 if (_configuration.SampleConfig2 == "test")
 {
 //...
 }
 }
}

這意味著,在abp框架的系統(tǒng)中,所有的模塊都可以集中配置。


ABP依賴注入
什么是依賴注入
如果你已經(jīng)知道依賴注入的概念,構(gòu)造函數(shù)和屬性注入模式,你可以跳過這一節(jié)。

維基百科說:“依賴注入是一種軟件設(shè)計(jì)模式的一個(gè)或多個(gè)依賴項(xiàng)注入(或服務(wù)),或通過引用傳遞,為依賴對(duì)象(或客戶)和客戶端狀態(tài)的一部分。模式之間建立一個(gè)客戶的依賴關(guān)系的行為,它允許程序設(shè)計(jì)是松散耦合的,依賴倒置和單一職責(zé)原則。它直接對(duì)比service locator模式,它允許客戶了解他們所使用的系統(tǒng)找到依賴。”。

如果不使用依賴注入技術(shù),很難進(jìn)行依賴管理、模塊化開發(fā)和應(yīng)用程序模塊化。

傳統(tǒng)方式的問題

在一個(gè)應(yīng)用程序中,類之間相互依賴。假設(shè)我們有一個(gè)應(yīng)用程序服務(wù),使用倉(cāng)儲(chǔ)(repository)類插入實(shí)體到數(shù)據(jù)庫(kù)。在這種情況下,應(yīng)用程序服務(wù)類依賴于倉(cāng)儲(chǔ)(repository)類。看下例子:

 public class PersonAppService
 {
 private IPersonRepository _personRepository;
 
 public PersonAppService()
 {
 _personRepository = new PersonRepository(); 
 }
 
 public void CreatePerson(string name, int age)
 {
 var person = new Person { Name = name, Age = age };
 _personRepository.Insert(person);
 }
 }

PersonAppService使用PersonRepository插入Person到數(shù)據(jù)庫(kù)。這段代碼的問題:

PersonAppService通過IPersonRepository調(diào)用CreatePerson方法,所以這方法依賴于IPersonRepository,代替了PersonRepository具體類。但PersonAppService(的構(gòu)造函數(shù))仍然依賴于PersonRepository。組件應(yīng)該依賴于接口而不是實(shí)現(xiàn)。這就是所謂的依賴性倒置原則。
如果PersonAppService創(chuàng)建PersonRepository本身,它成為依賴IPersonRepository接口的具體實(shí)現(xiàn),不能使用另一個(gè)實(shí)現(xiàn)。因此,此方式的將接口與實(shí)現(xiàn)分離變得毫無意義。硬依賴(hard-dependency)使得代碼緊密耦合和較低的可重用。
我們可能需要在未來改變創(chuàng)建PersonRepository的方式。即,我們可能想讓它創(chuàng)建為單例(單一共享實(shí)例而不是為每個(gè)使用創(chuàng)建一個(gè)對(duì)象)。或者我們可能想要?jiǎng)?chuàng)建多個(gè)類實(shí)現(xiàn)IPersonRepository并根據(jù)條件創(chuàng)建對(duì)象。在這種情況下,我們需要修改所有依賴于IPersonRepository的類。
有了這樣的依賴,很難(或不可能)對(duì)PersonAppService進(jìn)行單元測(cè)試。
為了克服這些問題,可以使用工廠模式。因此,創(chuàng)建的倉(cāng)儲(chǔ)類是抽象的。看下面的代碼:
 

 public class PersonAppService
 {
 private IPersonRepository _personRepository;
 
 public PersonAppService()
 {
 _personRepository = PersonRepositoryFactory.Create(); 
 }
 
 public void CreatePerson(string name, int age)
 {
 var person = new Person { Name = name, Age = age };
 _personRepository.Insert(person);
 }
 }

PersonRepositoryFactory是一個(gè)靜態(tài)類,創(chuàng)建并返回一個(gè)IPersonRepository。這就是所謂的服務(wù)定位器模式。以上依賴問題得到解決,因?yàn)镻ersonAppService不需要?jiǎng)?chuàng)建一個(gè)IPersonRepository的實(shí)現(xiàn)的對(duì)象,這個(gè)對(duì)象取決于PersonRepositoryFactory的Create方法。但是,仍然存在一些問題:

此時(shí),PersonAppService取決于PersonRepositoryFactory。這是更容易接受,但仍有一個(gè)硬依賴(hard-dependency)。
為每個(gè)庫(kù)或每個(gè)依賴項(xiàng)乏味的寫一個(gè)工廠類/方法。
測(cè)試性依然不好,由于很難使得PersonAppService使用mock實(shí)現(xiàn)IPersonRepository。
解決方案:

有一些最佳實(shí)踐(模式)用于類依賴。

構(gòu)造函數(shù)注入

重寫上面的例子,如下所示:

 public class PersonAppService
 {
 private IPersonRepository _personRepository;
 
 public PersonAppService(IPersonRepository personRepository)
 {
 _personRepository = personRepository;
 }
 
 public void CreatePerson(string name, int age)
 {
 var person = new Person { Name = name, Age = age };
 _personRepository.Insert(person);
 }
 }

這被稱為構(gòu)造函數(shù)注入。現(xiàn)在,PersonAppService不知道哪些類實(shí)現(xiàn)IPersonRepository以及如何創(chuàng)建它。誰需要使用PersonAppService,首先創(chuàng)建一個(gè)IPersonRepository PersonAppService并將其傳遞給構(gòu)造函數(shù),如下所示:

 var repository = new PersonRepository();
 var personService = new PersonAppService(repository);
 personService.CreatePerson("Yunus Emre", 19);

構(gòu)造函數(shù)注入是一個(gè)完美的方法,使一個(gè)類獨(dú)立創(chuàng)建依賴對(duì)象。但是,上面的代碼有一些問題:

創(chuàng)建一個(gè)PersonAppService變得困難。想想如果它有4個(gè)依賴,我們必須創(chuàng)建這四個(gè)依賴對(duì)象,并將它們傳遞到構(gòu)造函數(shù)PersonAppService。
從屬類可能有其他依賴項(xiàng)(在這里,PersonRepository可能有依賴關(guān)系)。所以,我們必須創(chuàng)建PersonAppService的所有依賴項(xiàng),所有依賴項(xiàng)的依賴關(guān)系等等. .如此,依賴關(guān)系使得我們創(chuàng)建一個(gè)對(duì)象變得過于復(fù)雜了。
幸運(yùn)的是,依賴注入框架自動(dòng)化管理依賴關(guān)系。

屬性注入

構(gòu)造函數(shù)注入模式是一個(gè)完美的提供類的依賴關(guān)系的方式。通過這種方式,您不能創(chuàng)建類的實(shí)例,而不提供依賴項(xiàng)。它也是一個(gè)強(qiáng)大的方式顯式地聲明是什么類的需求正確地工作。

但是,在某些情況下,該類依賴于另一個(gè)類,但也可以沒有它。這通常是適用于橫切關(guān)注點(diǎn)(如日志記錄)。一個(gè)類可以沒有工作日志,但它可以寫日志如果你提供一個(gè)日志對(duì)象。在這種情況下,您可以定義依賴為公共屬性,而不是讓他們放在構(gòu)造函數(shù)。想想,如果我們想在PersonAppService寫日志。我們可以重寫類如下:  

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("Inserting a new person to database with name = " + name);
 var person = new Person { Name = name, Age = age };
 _personRepository.Insert(person);
 Logger.Debug("Successfully inserted!");
 }
 }

NullLogger.Instance 是一個(gè)單例對(duì)象,實(shí)現(xiàn)了ILogger接口,但實(shí)際上什么都沒做(不寫日志。它實(shí)現(xiàn)了ILogger實(shí)例,且方法體為空)。現(xiàn)在,PersonAppService可以寫日志了,如果你為PersonAppService實(shí)例設(shè)置了Logger,如下面:

 var personService = new PersonAppService(new PersonRepository());
 personService.Logger = new Log4NetLogger();
 personService.CreatePerson("Yunus Emre", 19);

假設(shè)Log4NetLogger實(shí)現(xiàn)ILogger實(shí)例,使得我們可以使用Log4Net庫(kù)寫日志。因此,PersonAppService可以寫日志。如果我們不設(shè)置Logger,PersonAppService就不寫日志。因此,我們可以說PersonAppService ILogger實(shí)例是一個(gè)可選的依賴。

幾乎所有的依賴注入框架都支持屬性注入模式

依賴注入框架

有許多依賴注入框架,都可以自動(dòng)解決依賴關(guān)系。他們可以創(chuàng)建所有依賴項(xiàng)(遞歸地依賴和依賴關(guān)系)。所以你只需要根據(jù)注入模式寫類和類構(gòu)造函數(shù)&屬性,其他的交給DI框架處理!在良好的應(yīng)用程序中,類甚至獨(dú)立于DI框架。整個(gè)應(yīng)用程序只會(huì)有幾行代碼或類,顯示的與DI框架交互。

ABP的依賴注入基于 Castle Windsor框架。Castle Windsor最成熟的DI框架之一。還有很多這樣的框架,如Unity,Ninject,StructureMap,Autofac等等。

在使用一個(gè)依賴注入框架時(shí),首先注冊(cè)您的接口/類到依賴注入框架中,然后你就可以resolve一個(gè)對(duì)象。在Castle Windsor,它是這樣的:

 var container = new WindsorContainer();

 container.Register(
 Component.For<IPersonRepository>().ImplementedBy<PersonRepository>().LifestyleTransient(),
 Component.For<IPersonAppService>().ImplementedBy<PersonAppService>().LifestyleTransient()
 );
 
 var personService = container.Resolve<IPersonAppService>();
 personService.CreatePerson("Yunus Emre", 19);

我們首先創(chuàng)建了WindsorContainer。然后注冊(cè)PersonRepository 和 PersonAppService及它們的接口。然后我們要求容器創(chuàng)建一個(gè)IPersonAppService實(shí)例。它創(chuàng)建PersonAppService對(duì)象及其依賴項(xiàng)并返回。在這個(gè)簡(jiǎn)單的示例中,使用DI框架也許不是那么簡(jiǎn)潔,但想象下,在實(shí)際的企業(yè)應(yīng)用程序中你會(huì)有很多類和依賴關(guān)系。當(dāng)然,注冊(cè)的依賴項(xiàng)只在程序啟動(dòng)的某個(gè)地方創(chuàng)建一次。

請(qǐng)注意,我們只是講對(duì)象聲明為臨時(shí)對(duì)象(transient)。這意味著每當(dāng)我們創(chuàng)建這些類型的一個(gè)對(duì)象時(shí),就會(huì)創(chuàng)建一個(gè)新的實(shí)例。有許多不同的生命周期(如Singletion)。

ABP依賴注入的基礎(chǔ)結(jié)構(gòu)
在編寫應(yīng)用程序時(shí)遵循最佳實(shí)踐和一些約定,ABP幾乎讓依賴注入框架使用變得無形。

注冊(cè):

在ABP中,有很多種不同的方法來注冊(cè)你的類到依賴注入系統(tǒng)。大部分時(shí)間,常規(guī)方法就足夠了。

常規(guī)注冊(cè):

按照約定,ABP自動(dòng)注冊(cè)所有 Repositories, Domain Services, Application Services, MVC 控制器和Web API控制器。例如,您可能有一個(gè)IPersonAppService 接口和實(shí)現(xiàn)類PersonAppService:

 public interface IPersonAppService : IApplicationService
 {
 //...
 }
 
 public class PersonAppService : IPersonAppService
 {
 //...
 }

ABP會(huì)自動(dòng)注冊(cè)它,因?yàn)樗鼘?shí)現(xiàn)IApplicationService接口(它只是一個(gè)空的接口)。它會(huì)被注冊(cè)為transient (每次使用都創(chuàng)建實(shí)例)。當(dāng)你注入(使用構(gòu)造函數(shù)注入)IPersonAppService接口成一個(gè)類,PersonAppService對(duì)象會(huì)被自動(dòng)創(chuàng)建并傳遞給構(gòu)造函數(shù)。

命名約定在這里非常重要。例如你可以將名字PersonAppService改為 MyPersonAppService或另一個(gè)包含“PersonAppService”后綴的名稱,由于IPersonAppService包含這個(gè)后綴。但是你可以不遵循PeopleService命名您的服務(wù)類。如果你這樣做,它將不會(huì)為IPersonAppService自動(dòng)注冊(cè)(它需要自注冊(cè)(self-registration)到DI框架,而不是接口),所以,如果你想要你應(yīng)該手動(dòng)注冊(cè)它。

ABP按照約定注冊(cè)程序集。所以,你應(yīng)該告訴ABP按照約定注冊(cè)您的程序集。這很容易:

 IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

Assembly.GetExecutingAssembly()得到一個(gè)對(duì)包括此代碼的程序集的引用。你可以通過RegisterAssemblyByConvention方法注冊(cè)其他程序集。這同在你的模塊初始化(AbpModule.Initialize())時(shí)完成。請(qǐng)查看ABP的模塊系統(tǒng)獲得更多信息。

您可以通過實(shí)現(xiàn)IConventionalRegisterer接口和調(diào)用IocManager。AddConventionalRegisterer方法編寫自己的約定注冊(cè)類。你應(yīng)該將它添加到模塊的pre-initialize方法中。

幫助接口

你可以注冊(cè)一個(gè)特定的類,不遵循傳統(tǒng)的約定制度規(guī)則。ABP提供了ITransientDependency和ISingletonDependency接口的快捷方法。例如:

 public interface IPersonManager
 {
 //...
 }
 
 public class MyPersonManager : IPersonManager, ISingletonDependency
 {
 //...
 }

以這種方式,您可以很容易地注冊(cè)MyPersonManager為transient。當(dāng)需要注入IPersonManager時(shí),MyPersonManager會(huì)被使用。注意,依賴被聲明為單例。因此,創(chuàng)建的MyPersonManager同一個(gè)對(duì)象被傳遞給所有需要的類。只是在第一次使用時(shí)創(chuàng)建,那么應(yīng)用程序的整生命周期使用的是同一實(shí)例。

自定義/直接 注冊(cè)

如果之前描述的方法還是不足以應(yīng)對(duì)你的情況,你可以使用Castle Windsor注冊(cè)類和及依賴項(xiàng)。因此,您將擁有Castle Windsor注冊(cè)的所有能力。

可以實(shí)現(xiàn)IWindsorInstaller接口進(jìn)行注冊(cè)。您可以在應(yīng)用程序中創(chuàng)建一個(gè)實(shí)現(xiàn)IWindsorInstaller接口的類:

 public class MyInstaller : IWindsorInstaller
 {
 public void Install(IWindsorContainer container, IConfigurationStore store)
 {
 container.Register(Classes.FromThisAssembly().BasedOn<IMySpecialInterface>().LifestylePerThread().WithServiceSelf());
 }
 }

Abp自動(dòng)發(fā)現(xiàn)和執(zhí)行這個(gè)類。最后,你可以通過使用IIocManager.IocContainer屬性得到WindsorContainer。有關(guān)更多信息,閱讀Windsor的文檔。

解析(Resolving)

注冊(cè)通知IOC(控制反轉(zhuǎn))容器關(guān)于你的類,它們的依賴項(xiàng)和生命周期。在您的應(yīng)用程序需要使用IOC容器創(chuàng)建對(duì)象時(shí),ASP.NET提供了一些方法解決依賴關(guān)系。

構(gòu)造函數(shù) & 屬性注入

作為最佳實(shí)踐,你可以使用構(gòu)造函數(shù)和屬性注入去獲取你的類的依賴。任何可能的地方,你都應(yīng)該這樣做。例子:

 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("Inserting a new person to database with name = " + name);
 var person = new Person { Name = name, Age = age };
 _personRepository.Insert(person);
 Logger.Debug("Successfully inserted!");
 }
 }

IPersonRepository從構(gòu)造函數(shù)注入,ILogger實(shí)例從公共屬性注入。這樣,您的代碼不會(huì)體現(xiàn)依賴注入系統(tǒng)。這是使用DI系統(tǒng)最適當(dāng)?shù)姆绞健?/p>

IIocResolver 和 IIocManager

有時(shí)你可能需要直接創(chuàng)建你的依賴項(xiàng),而不是構(gòu)造函數(shù)和屬性注入。應(yīng)該盡可能避免這種情況,但它可能無法避免。Abp提供一些服務(wù)使得這樣的注入很容易實(shí)現(xiàn)。例子:

  

 public class MySampleClass : ITransientDependency
 {
 private readonly IIocResolver _iocResolver;
 
 public MySampleClass(IIocResolver iocResolver)
 {
 _iocResolver = iocResolver;
 }
 
 public void DoIt()
 {
 //Resolving, using and releasing manually
 var personService1 = _iocResolver.Resolve<PersonAppService>();
 personService1.CreatePerson(new CreatePersonInput { Name = "Yunus", Surname = "Emre" });
 _iocResolver.Release(personService1);
 
 //Resolving and using in a safe way
 using (var personService2 = _iocResolver.ResolveAsDisposable<PersonAppService>())
 {
 personService2.Object.CreatePerson(new CreatePersonInput { Name = "Yunus", Surname = "Emre" });
 }
 }
 }

MySampleClass是一個(gè)應(yīng)用程序的示例類。IIcResolver通過構(gòu)造函數(shù)注入,然后用它來創(chuàng)建和釋放對(duì)象。有幾個(gè)解決方法的重載可以根據(jù)需要使用。Release方法用于釋放組件(對(duì)象)。如果你是手動(dòng)創(chuàng)建一個(gè)對(duì)象,調(diào)用Release方法釋放對(duì)象非常重要。否則,您的應(yīng)用程序會(huì)有內(nèi)存泄漏問題。為了保證對(duì)象被釋放,盡可能使用ResolveAsDisposable(就像上面的例子所示)。它會(huì)在using代碼塊結(jié)束的時(shí)候自動(dòng)調(diào)用Release方法。

如果你想直接使用IOC容器(Castle Windsor)來處理依賴關(guān)系項(xiàng),可以通過構(gòu)造函數(shù)注入 IIocManager并使用它IIocManager.IocContainer 屬性。如果你是在一個(gè)靜態(tài)上下文或不能注入IIocManager,還有最后一個(gè)方法,你可以使用單例對(duì)象IocManager.Instance,你可以在任何地方獲取到,它無處不在。但是,在這種情況下你的代碼將變得不易容測(cè)試。

附加

IShouldInitialize 接口:

有些類在第一次使用前需要初始化。IShouldInitialize有Initialize()方法。如果你實(shí)現(xiàn)它,那么你的Initialize()方法自動(dòng)會(huì)被自動(dòng)調(diào)用在創(chuàng)建對(duì)象之后(在使用之前)。當(dāng)然,為了使用這個(gè)特性,你應(yīng)該注入/創(chuàng)建此對(duì)象。

ASP.NET MVC & ASP.NET Web API 集成:

當(dāng)然,我們必須調(diào)用依賴注入系統(tǒng)處理依賴關(guān)系圖的根對(duì)象。在一個(gè)ASP.NET MVC應(yīng)用程序,通常是一個(gè)控制器類。我們可以使用構(gòu)造函數(shù)注入模式注入控制器。當(dāng)一個(gè)請(qǐng)求來到我們的應(yīng)用程序中,控制器和所有依賴項(xiàng)被IOC容器遞歸創(chuàng)建。所以,誰做了這些?這是被Abp擴(kuò)展的ASP.NET MVC默認(rèn)控制器工廠自動(dòng)完成的。ASP.NET Web API 也是相似的。你不用關(guān)心對(duì)象的創(chuàng)建和釋放。

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

ABP框架的基礎(chǔ)配置及依賴注入講解

ABP框架的基礎(chǔ)配置及依賴注入講解:配置ABP 配置是通過在自己模塊的PreInitialize方法中來實(shí)現(xiàn)的 代碼示例如下: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //在你的應(yīng)用中添加語言包,這個(gè)是英語和作者的土耳其語。 C
推薦度:
標(biāo)簽: 基礎(chǔ) 框架 依賴注入
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 看全色黄大色大片免费久久 | 国产精品久久久久久免费播放 | 日韩123 | 国内一区二区三区精品视频 | 亚洲欧洲一区二区 | 免费的一级毛片 | 国产不卡视频在线播放 | 97精品国产91久久久久久 | 欧美久久天天综合香蕉伊 | 亚欧在线| er久99久热只有精品国产 | 日本a黄 | 亚洲欧美日韩色图 | 91导航在线观看 | 欧美xxxxxbbbbb | 大香伊人久久 | 免费一看一级毛片全播放 | 国产毛片久久久久久国产毛片 | 欧美 日韩 国产在线 | 91国内精品久久久久影院优播 | 欧美日韩中文字幕 | 人善交zzzxxx另类 | 免费亚洲网站 | 黄毛片| 亚洲黄色高清 | 国产成人在线免费视频 | 亚洲欧美日韩国产 | 日韩综合在线 | 亚洲欧美日韩在线 | 人人揉揉香蕉大青草 | 高龄五十路中出 | 成人欧美一区二区三区视频不卡 | 明星国产欧美日韩在线观看 | 91精品欧美一区二区三区 | 视频在线观看国产 | 欧美日韩大尺码免费专区 | 阿v精品一区二区三区 | 伊人精品国产 | 成人亚洲欧美日韩在线 | 国产女人在线视频 | 精品日韩在线观看 |