最近心血來潮逛看看最近有哪些 web hosting 的時候發現 Godaddy 竟然支援 .Net Core 了 !!
於是乎抱著滿心期待的拿了魔法小卡刷了一個月來試玩看看,刷完才發現竟然只支援 .Net Core 2.0 …
瀏覽標籤:
.NET Core
[C#][DI] 相互依賴造成循環注入死結
問題緣由
最近在寫 .NET Core 的時候遇到了一個問題
1 |
A circular dependency was detected for the service of type 'WebApplication1.Service.A1Service' |
A1Service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class A1Service { private readonly string guid = null; private readonly A2Service _a2Service = null; public A1Service(A2Service a2Service) { _a2Service = a2Service; if (guid == null) { guid = Guid.NewGuid().ToString(); } } public void Run() { Console.WriteLine("A1Service: " + guid); } public void RunOther() { _a2Service.Run(); } } |
這是網路教學文章上常見的從建構子中依賴注入 A2Service
的程式
接著我們再來看看另外一支程式
A2Service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class A2Service { private readonly string guid = null; private readonly A1Service _a1Service = null; public A2Service(A1Service a1Service) { _a1Service = a1Service; if (guid == null) { guid = Guid.NewGuid().ToString(); } } public void Run() { Console.WriteLine("A2Service: " + guid); } public void RunOther() { _a1Service.Run(); } } |
這裡就發生了一個循環依賴的問題 A1Service
在建構子中注入了 A2Service
,而 A2Service
也在建構子中注入了 A1Service
,造成兩個物件互相依賴造成 Exception
解決方法
改成不直接在建構子中注入 Service ,改注入 IServiceProvider
,再利用 GetService
這個方法來取得物件,這樣就可以順利解決這個問題囉。
A3Service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class A3Service { private readonly string guid = null; private readonly IServiceProvider _serviceProvider = null; public A3Service(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; if (guid == null) { guid = Guid.NewGuid().ToString(); } } public void Run() { Console.WriteLine("A3Service: " + guid); } public void RunOther() { _serviceProvider.GetService<A4Service>().Run(); } } |
A4Service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class A4Service { private readonly string guid = null; private readonly IServiceProvider _serviceProvider = null; public A4Service(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; if (guid == null) { guid = Guid.NewGuid().ToString(); } } public void Run() { Console.WriteLine("A4Service: " + guid); } public void RunOther() { _serviceProvider.GetService<A3Service>().Run(); } } |
[.NET Core] 將 NET Core 部署至 Ubuntu Server 16.04
最近裝了個Linux Server想來玩玩看NET Core並佈署到上面,結果發現好多眉眉角角,網路上的文件似乎有點舊讓我一直撞牆撞不停,經過了幾個小時的煎熬最後終於成功了,這裡筆記一下方便下次使用…
首先按照 官網 提供的步驟進行安裝如下:
- 加入apt-get來源
123sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893sudo apt-get update - 開始安裝
1sudo apt-get install dotnet-dev-1.0.4 - 建立一個空資料夾
12mkdir HelloWebAppcd HelloWebApp - 初始化MVC專案
1dotnet new mvc
Templates清單:
12345678910Templates Short Name Language Tags----------------------------------------------------------------------Console Application console [C#], F# Common/ConsoleClass library classlib [C#], F# Common/LibraryUnit Test Project mstest [C#], F# Test/MSTestxUnit Test Project xunit [C#], F# Test/xUnitASP.NET Core Empty web [C#] Web/EmptyASP.NET Core Web App mvc [C#], F# Web/MVCASP.NET Core Web API webapi [C#] Web/WebAPISolution File sln Solution - 檢查套件是否遺失並安裝
1dotnet restore - 安裝Apache反向代理(Reverse-Proxy)
123456789sudo a2enmod proxysudo a2enmod proxy_httpsudo a2enmod proxy_ajpsudo a2enmod rewritesudo a2enmod deflatesudo a2enmod headerssudo a2enmod proxy_balancersudo a2enmod proxy_connectsudo a2enmod proxy_html - 設定000-default.conf
12345<VirtualHost *:80>ProxyPreserveHost OnProxyPass / http://127.0.0.1:5000/ProxyPassReverse / http://127.0.0.1:5000/</VirtualHost> - 重新啟動Apach並啟動.NET Core專案
12sudo service apache2 restartdotnet run - 完成 !!
- 2017/05/24 開啟啟動&背景執行
新增:/etc/systemd/system/kestrel-hellomvc.service
123456789101112131415[Unit]Description = https://blog.exfast.me/[Service]WorkingDirectory = /home/user/HelloWebApp/ExecStart = /usr/bin/dotnet run /home/user/HelloWebApp/HelloWebApp.dllRestart = always# Restart service after 10 seconds if dotnet service crashesRestartSec = 10SyslogIdentifier = dotnet-exampleUser = userEnvironment = ASPNETCORE_ENVIRONMENT = Production[Install]WantedBy = multi-user.target
指令:
12345sudo systemctl stop kestrel-hellomvcsudo systemctl disable kestrel-hellomvcsudo systemctl enable kestrel-hellomvcsudo systemctl start kestrel-hellomvcsudo systemctl status kestrel-hellomvc
來源: