在一個 ASP.NET Core 3.1 網站中,我試圖在一個不是控制器的類中使用建構式依賴注入,它似乎沒有按預期作業。MyService.cs似乎沒有獲取類實體并引發錯誤......這需要我從控制器傳遞它,而不是像預期的那樣在建構式中進行依賴注入。
需要澄清的一些注意事項:MyService.cs是業務規則的集合,而不是我嘗試注入的服務(也稱為業務服務)。我要做的就是訪問在 Startup.cs 中宣告的DataAccessLayerInterface DataAccessLayerService 實體。問題是當我嘗試在建構式中使用依賴注入時它不起作用并引發編譯錯誤。如果我在控制器中做同樣的事情,盡管它可以讓我感到困惑。
最終,我計劃將其構建為資料層,但現在我只是傳遞一個字串,目的是稍后再構建它。以下是我一直在研究的相關部分。為簡潔起見,我去掉了命名空間和 using 陳述句參考。我在適用的情況下使用Microsoft.Extensions.DependencyInjection。
啟動.cs
public void ConfigureServices(IServiceCollection services) {
services.AddScoped<DataAccessLayerInterface> (options => new DataAccessLayerService("acorns"));
}
MyAPIController.cs
public class MyAPIController : Controller {
public ActionResult tell_me() {
MyService _business_service = new MyService();
string _response = _business_service.tell_me_something();
Hashtable _data = new Hashtable();
_data.Add("squirrels eat", _response);
return Json(_data);
}
}
我的服務.cs
public class MyService {
DataAccessLayerInterface _DataAccessLayerService;
public MyService(DataAccessLayerInterface MyDataAccessLayerService) {
this._DataAccessLayerService = MyDataAccessLayerService;
}
public string tell_me_something() {
return _DataAccessLayerService.we_eat();
}
}
DataAccessLayerHelper.cs
public interface DataAccessLayerInterface {
string we_eat();
}
public class DataAccessLayerService : DataAccessLayerInterface {
private string _food = "rocks";
public string we_eat() {
return this._food;
}
public DataAccessLayerService(string MyFood) {
this._food = MyFood;
}
}
如果我在控制器中添加建構式依賴注入,然后將其傳遞給每個部分,它在技術上是有效的,但在架構上似乎是不正確的,因為業務服務不應該需要任何引數并且應該完全獨立于控制器。IE:
private DataAccessLayerInterface _DataAccessLayerService;
public UserAPIController(DataAccessLayerInterface MyDataAccessLayerService) {
this._DataAccessLayerService = MyDataAccessLayerService;
}
// in tell_me() action result, now I have to pass the object like so
string _response = _business_service.tell_me_something(_DataAccessLayerService);
Instead of constructor injection in the MyService.cs I also tried to just get the instance in the constructor like this and it didn't seem to work either...
public MyService() {
this._DataAccessLayerService = (DataAccessLayerInterface)ServiceProvider.GetService(typeof(DataAccessLayerInterface));
}
It seems to me like the instance is created ok with dependency injection, but it only seems to work with controllers and not my own custom classes. Any suggestions?
uj5u.com熱心網友回復:
有3種方法可以解決您的問題。
1-好方法
像這樣為您的服務創建一個介面
public interface IMyService
{
string tell_me_something();
}
public class MyService : IMyService
{
DataAccessLayerInterface _DataAccessLayerService;
public MyService(DataAccessLayerInterface MyDataAccessLayerService)
{
this._DataAccessLayerService = MyDataAccessLayerService;
}
public string tell_me_something()
{
return _DataAccessLayerService.we_eat();
}
}
只需將其添加到 DI
services.AddScoped<IMyService, MyService> ();
并注入IMyService控制器。
2- 將 MyService 注入 DI
services.AddScoped(provider=>
new MyService(provider.GetRequiredService<DataAccessLayerInterface>());
并注入MyService控制器;
3-不好的方式
創建服務實體時使用:
var service = new MyService(HttpContext.RequestServices.GetRequiredService<DataAccessLayerInterface>());
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446542.html
標籤:c# asp.net-core dependency-injection service ioc-container
