Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ASP.NET MVC将依赖项注入C#中的模型_C#_Asp.net Mvc_.net Core_Dependency Injection - Fatal编程技术网

使用ASP.NET MVC将依赖项注入C#中的模型

使用ASP.NET MVC将依赖项注入C#中的模型,c#,asp.net-mvc,.net-core,dependency-injection,C#,Asp.net Mvc,.net Core,Dependency Injection,我是第一次使用依赖注入,我有一些问题 由于单一责任原则,我有一个实体类和一个实体集合类 实体类(user)只能更新自身 集合类(userContainer)可以添加、删除和获取所有用户 我可以注入容器类,因为我没有需要在构造函数中定义的属性 公共类UserCollection:IUserCollection { 私有只读IUserCollectionDAL_userDAL; 公共用户集合(IUserCollectionDAL userDAL) { _userDAL=userDAL; } }

我是第一次使用依赖注入,我有一些问题

由于单一责任原则,我有一个实体类和一个实体集合类

  • 实体类(
    user
    )只能更新自身
  • 集合类(
    userContainer
    )可以添加、删除和获取所有用户
我可以注入容器类,因为我没有需要在构造函数中定义的属性

公共类UserCollection:IUserCollection
{
私有只读IUserCollectionDAL_userDAL;
公共用户集合(IUserCollectionDAL userDAL)
{
_userDAL=userDAL;
}
}
所以这很好用。但在以下情况下,它无法正常工作:

公共类用户
{
私人IProjectCollection项目集合;
public int UserId{get;set;}
公共字符串角色{get;set;}
公共字符串用户名{get;set;}
公共字符串电子邮件{get;set;}
公共用户(/*InjectProjectCollection不工作,*/int userId,字符串用户名,字符串电子邮件,字符串角色)
{
this.UserId=UserId;
这个角色=角色;
this.Username=用户名;
this.Email=电子邮件;
}
}
这不起作用,因为如果我想创建一个用户,我需要注入新的
projectCollection

Startup.cs:

public void配置服务(IServiceCollection服务)
{
services.addScope();
services.addScope();
services.addScope();
services.addScope();
services.addScope();
services.addScope();
services.AddControllersWithViews();
}

知道如何将属性注入到模型中吗?

您还需要添加一个默认构造函数

public User () {}
在部分类中移动额外代码是一种更好的编码方式

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注入的工厂类。 例如,UserCollection的构造函数:

UserCollection(Func userFactory)
当您需要创建用户时,您可以调用这个func并获得IOC注入实例。不能说您的容器,但Unity将自动解决此类功能-无需注册。 但是,在您的情况下,您需要参数化构造函数-因此您需要一个工厂类。 例如:

公共类用户{
公营工厂{
私人IProjectCollection项目;
公共工厂(IProjectCollection项目){
this.project=项目;
}
公共用户创建(…)=>新用户(项目,…);
}
}
公共类用户集合{
公共UserCollection(User.Factory userFactory){…}
}
现在使用userFactory.Create来实例化用户。
同样,如果容器是Unity,则不需要任何注册,对于其他容器,我无法确定。

这是否回答了您的问题?你能给我们看看你的项目集吗?