使用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,则不需要任何注册,对于其他容器,我无法确定。这是否回答了您的问题?你能给我们看看你的项目集吗?