在我的ASP.Net Core MVC 6解決方案中,我有兩套控制器。一套包含其常規視圖的網頁。另一組包含API控制器。ASP.Net Core從另一個控制器調用控制器
爲避免重複使用數據庫邏輯,Web控制器正在使用API控制器。目前,我正在通過將DbContext作爲構造函數參數手動創建所需控制器的實例。這是通過依賴注入給予Web控制器的DbContext。
但是,無論何時向API控制器添加其他構造函數參數,我都需要修改所有使用此API控制器的Web控制器。
如何使用內建的依賴注入系統內建到ASP.Net 5來爲我創建所需API控制器的實例?然後它會自動填寫所需的構造函數參數。
一種解決方案可能是將數據庫邏輯從API控制器移動到單獨的層,並從API和Web控制器中調用該邏輯。這不會解決我的問題,因爲新層仍然需要相同的參數,我不喜歡不必要的佈線。
另一種解決方案是讓Web控制器通過Web調用來訪問API,但這隻會增加應用程序的複雜性。
今天我這樣做:
public IActionResult Index()
{
using (var foobarController = new Areas.Api.Controllers.FoobarController(
// All of these has to be in the constructor of this controller so they can be passed on to the ctor of api controller
_dbContext, _appEnvironment,
_userManager, _roleManager,
_emailSender, _smsSender))
{
var model = new IndexViewModel();
model.Foo = foobarController.List(new FoobarRequest() { Foo = true, Bar = false });
model.Bar = foobarController.List(new FoobarRequest() { Foo = false, Bar = true });
return View(model);
}
}
,我希望這樣的事情: (這個例子不工作。)
using (var foobarController = CallContextServiceLocator.Locator.ServiceProvider.GetService<Areas.Api.Controllers.FoobarController>())
{
var model = new IndexViewModel();
model.Foo = foobarController.List(new FoobarRequest() { Foo = true, Bar = false });
model.Bar = foobarController.List(new FoobarRequest() { Foo = false, Bar = true });
return View(model);
}
這並沒有解決任何問題。引用自己的看法:「一種解決方案可能是將數據庫邏輯從API控制器移到單獨的層,並從API和Web控制器中調用它,但這並不能解決我的問題,因爲新層仍然需要相同的參數,而我不是不必要的接線迷。「 –
使用依賴注入系統來獲取該事物的一個實例。我不明白爲什麼這是一個問題。你可以用一些間接的方法來解決任何問題:D – davidfowl