簡體   English   中英

使用 ASP.NET MVC 將依賴注入到 C# 中的 model

[英]Dependency injection into model in C# using ASP.NET MVC

我是第一次使用依賴注入,我遇到了一些問題。

由於單一職責原則,我有一個實體 class 和該實體的集合 class。

  • 實體 class( user )只能更新自己
  • 集合 class ( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM