我現在正在 ASP.NET Core 中嘗試 DI。
我創建了一個單例物件,并在其中保存了一些應用程式資訊。
我可以將依賴項注入建構式、剃須刀頁面和存盤庫,但不知道如何注入物體。
MyConfig.cs:
public interface IMyConfig
{ ... }
public class MyConfig:IMyConfig
{
public MyConfig() {}
public string CompanyName { get { return _companyName; } }
public string ContactEMail { get { return _contactEmail; } }
}
程式.cs:
builder.Services.AddSingleton<IMyConfig, MyConfig>(); // application information
builder.Services.AddSingleton<IMyRep, MyRep>(); // my repository
存盤庫.cs:
public interface IMyRep
{
public string GetCompanyName();
public IEnumerable<IUser> GetUsers();
}
public class MyRep : IMyRep
{
private readonly DbContext _context;
private readonly MyConfig _config;
public MyRep(DbContext context, MyConfig config)
{
_context = context;
_config = config;
}
public string GetCompanyName() { return _config.CompanyName; }
public string GetContactEmail() { reutnr _config.ContactEmail; }
public GetUsers()
{
_context.Users.Select(m => m);
}
}
以上所有代碼都有效。
除此之外,我想將 MyConfig 注入 User 物體。
它包含 User 中的特定 MyConfig 資訊,如下所示。
用戶.cs:
public interface IUser
{
public int Id { get;set; }
public string Name { get;set; }
public string Company { get; }
}
public class User: IUser
{
private readonly IMyConfig _config;
public User(IMyConfig config)
{
_config = config;
}
public int Id { get;set; }
public string Name { get;set; }
public string Company { get { return _config.CompanyName; } }
}
雖然我試圖在 program.cs 中實作以下代碼,但沒有奏效。
builder.Services.AddSingleton<IUser, User>();
我可以將物件注入物體嗎?
uj5u.com熱心網友回復:
我將根據您的代碼提供一個簡單的示例,并指出您代碼中的問題:
MyConfig.cs:
public interface IMyConfig
{
string CompanyName { get; }
string ContactEMail { get; }
}
public class MyConfig : IMyConfig
{
public MyConfig() { }
public string CompanyName { get { return "Company"; } }
public string ContactEMail { get { return "Email"; } }
}
存盤庫.cs:
注入時,應該注入MyConfig
介面,而不是實作方法。IMyConfig
public interface IMyRep
{
public string GetCompanyName();
public string GetContactEmail();
public IEnumerable<IUser> GetUsers();
}
public class MyRep : IMyRep
{
private readonly MyDbContext _context;
private readonly IMyConfig _config;
public MyRep(MyDbContext context, IMyConfig config)
{
_context = context;
_config = config;
}
public string GetCompanyName() { return _config.CompanyName; }
public string GetContactEmail() { return _config.ContactEMail; }
public IEnumerable<IUser> GetUsers()
{
return _context.Users.Select(m => m);
}
}
用戶.cs:
public interface IUser
{
public int Id { get; set; }
public string Name { get; set; }
public string Company { get; }
}
public class User : IUser
{
private readonly IMyConfig _config;
public User(IMyConfig config)
{
_config = config;
}
public int Id { get; set; }
public string Name { get; set; }
public string Company { get { return _config.CompanyName; } }
}
程式.cs:
IMyConfig
, IMyRep
,IUser
應注冊為Scoped
.
builder.Services.AddScoped<IMyConfig, MyConfig>();
builder.Services.AddScoped<IMyRep, MyRep>();
builder.Services.AddScoped<IUser, User>();
然后我可以成功傳遞MyConfig.CompanyName
給User.Company
:
public class HomeController : Controller
{
private readonly IUser _user;
public HomeController(IUser user)
{
_user = user;
}
public IActionResult Index()
{
var Company = _user.Company;
return View();
}
}
這是你所期望的嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/518147.html