[英]Dependency injection into model in C# using ASP.NET MVC
我是第一次使用依賴注入,我遇到了一些問題。
由於單一職責原則,我有一個實體 class 和該實體的集合 class。
user
)只能更新自己userContainer
) 可以添加、刪除和獲取所有用戶我可以注入到容器 class 中,因為我沒有需要在構造函數中定義的屬性。
public class UserCollection : IUserCollection
{
private readonly IUserCollectionDAL _userDAL;
public UserCollection(IUserCollectionDAL userDAL)
{
_userDAL = userDAL;
}
}
所以這很好用。 但在以下情況下它不能正常工作:
public class User
{
private IProjectCollection ProjectCollection;
public int UserId { get; set; }
public string Role { get; set; }
public string Username { get; set; }
public string Email { get; set; }
public User(/*inject projectCollection not working ,*/int userId, string username, string email, string role)
{
this.UserId = userId;
this.Role = role;
this.Username = username;
this.Email = email;
}
}
這是行不通的,因為如果我想創建一個用戶,我需要注入新的projectCollection
。
啟動.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IBugCollectionDAL, BugDAL>();
services.AddScoped<IProjectCollectionDAL, ProjectDAL>();
services.AddScoped<IUserCollectionDAL, UserDAL>();
services.AddScoped<IBugCollection, BugCollection>();
services.AddScoped<IProjectCollection, ProjectCollection>();
services.AddScoped<IUserCollection, UserCollection>();
services.AddControllersWithViews();
}
知道如何注入具有屬性的 model 嗎?
您還需要添加默認構造函數
public User () {}
將您的額外代碼移動到部分 class 中是一種更好的編碼風格
public partial class User
{
public User(IProjectCollection projectCollection ,int userId, string username,
string email, string role)
{
this.UserId = userId;
this.Role = role;
this.Username = username;
this.Email = email;
}
}
通常,當您在某些類中創建新實例並且希望 IOC 容器將依賴項注入新實例時,這意味着您需要使用工廠 - 工廠方法或由 IOC 注入的工廠 class。 例如,UserCollection 的構造函數:
UserCollection(Func<User> userFactory)
當你需要創建用戶時,你調用這個函數並獲得 IOC 注入的實例。 不能說你的容器,但 Unity 會自動解析這樣的 function - 不需要注冊。 但是,在您的情況下,您需要參數化構造函數 - 因此您需要一個工廠 class。例如:
public class User {
public class Factory {
private IProjectCollection projects;
public Factory(IProjectCollection projects) {
this.project = projects;
}
public User Create(...) => new User(projects, ...);
}
}
public class UserCollection {
public UserCollection (User.Factory userFactory) { ... }
}
現在使用 userFactory.Create 來實例化 User。 同樣,如果容器是 Unity,則不需要任何注冊,對於我無法分辨的其他容器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.