使用子对象的依赖注入

时间:2015-06-22 16:05:08

标签: c# dependency-injection

我有一个名为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也可以与对象一起返回,但注入角色将无法工作,因为在填充用户之前无法检索它们。

1 个答案:

答案 0 :(得分:1)

直接访问List<Roles>强制您在创建User时填充列表。这意味着你的工厂&#34;对于User对象,还需要调用&#34;角色提供者&#34;获取用户的角色列表。

假设你正在使用像Unity这样的DI容器代码类似于:

_container.RegisterFactory(container => 
 {
     var user = new User(); 
     user.Roles = container.Resolve<IRolesProvider>()
            .GetRolesForUser(user);
     return user;
 });

或者,您可以将依赖项添加到&#34;角色提供程序&#34;到User并根据需要计算(可能使用缓存):

 class User
 {
    IRolesProvider roles;
    public User(IRolesProvider roles,....)
    {
        this.roles = roles;
        ...
    }

    public List<Roles> { get { return roles.GetRolesForUser(this);}}
    ...
 }