具有子对象的依赖项注入
本文关键字:依赖 注入 对象 | 更新日期: 2023-09-27 17:57:29
我有一个名为User
的类,它具有List <Role>
的属性。
使用依赖项注入,如果我需要首先了解用户,我如何填充角色?也就是说,角色依赖于用户,所以我不能在实例化时注入它们,因为我现在不了解用户,因为我需要首先调用一个返回用户对象的方法,比如GetUser (username);
。
更新
这是我有的类结构
public partial class User:IUser
{
private List<IUserRole> _userRoles = new List<IUserRole>();
public User()
{
}
public User GetUserByID(int id, dbEntities context)
{
User user = new User();
using(context)
{
user = (from u in context.Users where u.ID == id select u).FirstOrDefault();
}
return user;
}
public User GetUser(string username, string password, dbEntities context)
{
User user = new User();
using (context)
{
user = (from u in context.Users where u.Username==username && u.Password==password select u).FirstOrDefault();
}
return user;
}
List<IUserRole> UserRoles
{
get
{
return _userRoles;
}
set
{
_userRoles = value;
}
}
}
正如您所看到的,通过各种方法检索填充的用户对象。然而,我确实希望UserRoles也与对象一起返回,但注入角色是不起作用的,因为在填充用户之前无法检索它们。
直接访问List<Roles>
会迫使您在创建User
时填充列表。这意味着User
对象的"工厂"也需要调用"角色提供者"来获取用户的角色列表。
假设你正在使用一些像Unity这样的DI容器,代码看起来类似于:
_container.RegisterFactory(container =>
{
var user = new User();
user.Roles = container.Resolve<IRolesProvider>()
.GetRolesForUser(user);
return user;
});
或者,您可以将对"角色提供者"的依赖添加到User
,并按需计算(可能带有缓存):
class User
{
IRolesProvider roles;
public User(IRolesProvider roles,....)
{
this.roles = roles;
...
}
public List<Roles> { get { return roles.GetRolesForUser(this);}}
...
}