具有子对象的依赖项注入

本文关键字:依赖 注入 对象 | 更新日期: 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);}}
    ...
 }