Asp.Net DDD架構(gòu)淺談——依賴注入Autofac

本系列目錄

Asp.Net DDD架構(gòu)淺談——整體框架說(shuō)明
Asp.Net DDD架構(gòu)淺談——領(lǐng)域劃分、倉(cāng)儲(chǔ)應(yīng)用、Services層定義
Asp.Net DDD架構(gòu)淺談——圖片上傳被芳、縮略裁剪
Asp.Net DDD架構(gòu)淺談——依賴注入Autofac
Asp.Net DDD架構(gòu)淺談——網(wǎng)站配置

控制反轉(zhuǎn)(Inversion of Control汤求,縮寫(xiě)為IoC)是開(kāi)發(fā)中的一種設(shè)計(jì)模式议慰,可以理解為面向接口編程速址,可以有效的降低耦合度。舉個(gè)例子逆粹,看我們的解決方案圖:


Steven.Domain

我們把Repsositories和Services的接口都定義在Steven.Domain里面募疮,而實(shí)現(xiàn)是單獨(dú)的項(xiàng)目Steven.Domain.Repositories和Steven.Domain.Services。
為什么要這么麻煩呢僻弹? 合在一起不好嗎阿浓?
合在一起的話?cǎi)詈隙忍撸绻獡QORM會(huì)很麻煩蹋绽,比如說(shuō)我現(xiàn)在在Steven.Domain.Repositories中用的是Dapper芭毙,而如果我想轉(zhuǎn)用EntityFramework,我只要新建一個(gè)項(xiàng)目Steven.Domain.EFRepositories卸耘,然后在新項(xiàng)目中實(shí)現(xiàn)接口即可退敦,對(duì)于Presentation層來(lái)說(shuō),沒(méi)有任何改變鹊奖,因?yàn)樵赑resentation層我們調(diào)用的是接口苛聘。

Autofac

Autofac是一個(gè)開(kāi)源的依賴注入框架涂炎,使用也非常簡(jiǎn)單忠聚,首先是通過(guò)NuGet安裝:

Autofac

然后創(chuàng)建一個(gè)配置類DependencyConfig,在里面做好接口配置

    public class DependencyConfig
    {
        public static void Register()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(Assembly.GetCallingAssembly())//注冊(cè)mvc的Controller
                .PropertiesAutowired();//屬性注入
            builder.RegisterGeneric(typeof(Repository<>))
                .As(typeof(IRepository<>))
                .InstancePerRequest()//每次http請(qǐng)求
                .PropertiesAutowired();//屬性注入

            //Repositories的注入
            builder.RegisterAssemblyTypes(typeof(UsersRepository).Assembly)
                .Where(t => t.Name.EndsWith("Repository"))
                .AsImplementedInterfaces()
                .InstancePerRequest()
                .PropertiesAutowired();
 
            //Services的注入
            builder.RegisterAssemblyTypes(typeof(FormsAuthenticationSvc).Assembly)
                .Where(t => t.Name.EndsWith("Svc"))
                .AsImplementedInterfaces()
                .InstancePerRequest()
                .PropertiesAutowired();

            //Cache的注入唱捣,使用單例模式
            builder.RegisterType<RedisCacheManager>()
                .As<ICacheManager>()
                .SingleInstance()
                .PropertiesAutowired();
            
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }

然后再Global.asax中配置两蟀,Application_Start網(wǎng)站啟動(dòng)的時(shí)候進(jìn)行配置:

DependencyConfig.Register();

如何使用呢?非常簡(jiǎn)單震缭, 我們打開(kāi)HomeController看下:

    public class HomeController : WebSiteController
    {
        public IArticleRepository ArticleRepository { get; set; }

        public ActionResult Index()
        {
            var list = ArticleRepository.GetAll();
            return View(list);
        }

        public ActionResult Detail(string id)
        {
            var article = ArticleRepository.GetByIndex(id);
            if (article == null)
            {
                return Redirect(Url.Home());
            }
            //update view count
            ArticleRepository.UpdateViewCount(article.Id);
            return View(article);
        }
    }

只需要定義一個(gè)屬性即可:public IArticleRepository ArticleRepository { get; set; } 是不是非常簡(jiǎn)單赂毯!
上面用到的是屬性注入的方式,回過(guò)頭了看下DependencyConfig類的定義,每個(gè)配置后面都有這么一句代碼:PropertiesAutowired()党涕,這就是表示使用屬性配置烦感。而在以前,我使用構(gòu)造函數(shù)注入膛堤,下面讓我們來(lái)看下構(gòu)造函數(shù)注入有什么不同:
首先是DependencyConfig的配置手趣,把PropertiesAutowired()刪掉即可,然后是使用到接口的地方肥荔,比如說(shuō)HomeController:

    public class HomeController : WebSiteController
    {
        private readonly IArticleRepository ArticleRepository;
        public HomeController(IArticleRepository articleRepository)
        {
            ArticleRepository = articleRepository;
        }

        public ActionResult Index()
        {
            var list = ArticleRepository.GetAll();
            return View(list);
        }

        public ActionResult Detail(string id)
        {
            var article = ArticleRepository.GetByIndex(id);
            if (article == null)
            {
                return Redirect(Url.Home());
            }
            //update view count
            ArticleRepository.UpdateViewCount(article.Id);
            return View(article);
        }
    }

屬性變成了私有變量绿渣,并且在HomeController的構(gòu)造函數(shù)中傳一個(gè)參數(shù)過(guò)來(lái)賦值。這種方式稍顯麻煩燕耿,個(gè)人意見(jiàn)中符。

注意事項(xiàng)

依賴注入的兩個(gè)類中不能互相依賴,比如說(shuō)我們?cè)贏Repository中用到了IBRepository誉帅,那么就不能再BRepository里面注入IARepository淀散,這樣會(huì)無(wú)限循環(huán),導(dǎo)致異常蚜锨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吧凉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子踏志,更是在濱河造成了極大的恐慌阀捅,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件针余,死亡現(xiàn)場(chǎng)離奇詭異饲鄙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)圆雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門忍级,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伪朽,你說(shuō)我怎么就攤上這事轴咱。” “怎么了烈涮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵朴肺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坚洽,道長(zhǎng)戈稿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任讶舰,我火速辦了婚禮鞍盗,結(jié)果婚禮上需了,老公的妹妹穿的比我還像新娘。我一直安慰自己般甲,他們只是感情好肋乍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著敷存,像睡著了一般住拭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上历帚,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天滔岳,我揣著相機(jī)與錄音,去河邊找鬼挽牢。 笑死谱煤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禽拔。 我是一名探鬼主播刘离,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼睹栖!你這毒婦竟也來(lái)了硫惕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤野来,失蹤者是張志新(化名)和其女友劉穎恼除,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曼氛,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豁辉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舀患。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徽级。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖聊浅,靈堂內(nèi)的尸體忽然破棺而出餐抢,到底是詐尸還是另有隱情,我是刑警寧澤低匙,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布旷痕,位于F島的核電站,受9級(jí)特大地震影響努咐,放射性物質(zhì)發(fā)生泄漏苦蒿。R本人自食惡果不足惜殴胧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一渗稍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦鸳碧、人聲如沸妇穴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秉溉。三九已至,卻和暖如春碗誉,著一層夾襖步出監(jiān)牢的瞬間召嘶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工哮缺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弄跌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓尝苇,卻偏偏與公主長(zhǎng)得像铛只,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糠溜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348