0

我正在学习 Ninject 作为我的第一个 DI 容器,我想所有容器都会有类似的想法,所以这是我的问题。

我有一个类 UserRepository 有一个功能:

//constructor
public UserRepository(Kernel kernel) { _kernel = kernel; } 

public UserDataModel CreateNewUser(string title, string firstname,
    string lastname, int age ...) 
{
    //I have the kernel registered everything properly
    //Getting a new user object from the kernel
    var user = _kernel.Get<UserDataModel>(); 

    user.Title = title;
    user.Firstname = firstname;
    user.Lastname = lastname;
    ...
    return user;
} 

它是使用内核的正确方法吗?我从其他帖子中读到,暴露和传递内核是一个坏主意。如果是这样,正确的方法是什么?

编辑

我的一些代码演示了 tempUser 对象的使用

public int UpdateSaUser(Guid msuserid, UserProfile saprofile,
    string accesstoken = "") 
{
    using (var db = new SaModelContainer()) 
    {
        var row1 = MakeNewRow(msuserid, saprofile, accesstoken);
        var row2 = db.SaUser.SingleOrDefault(
            r => r.MsUserId.Equals(msuserid));
        if (row2 == null) { //add new
            db.sauth_User.Add(row1);
        } else { //modify
            var entry = db.Entry(row2);
            entry.OriginalValues.SetValues(row2); 
            entry.CurrentValues.SetValues(row1); 
        }
        return db.SaveChanges();
    }
}

private SaUser MakeNewRow(Guid msuserid, UserProfile saprofile,
    string accesstoken = "") 
{
        var row = new SaUser {
            MsUserId = msuserid,
            Provider = (int)saprofile.Provider,
            ProfileId = saprofile.ID,
            Email = saprofile.Email,
            AccessToken = accesstoken,
            FirstName = saprofile.FirstName,
            LastName = saprofile.LastName,
            FullName = saprofile.FullName,
            UserName = saprofile.Username,
            DisplayName = saprofile.DisplayName,
            Country = saprofile.Country,
            DoB = StringParser.ParseDate(saprofile.DateOfBirth),
            Gender = (int)saprofile.GenderType,
            Language = saprofile.Language,
            ProfileURL = saprofile.ProfileURL,
            ProfilePictureURL = saprofile.ProfilePictureURL
        };

        return row;
}
4

1 回答 1

2

您应该注入您的依赖项,也称为依赖项注入。而不是注入内核。

示例(这称为构造函数注入):



private UserDataModel _userDataModel;

[Inject]
public UserRepository(UserDataModel userDataModel)
{
    _userDataModel = userDataModel;
}

//Any other method can now use _userDataModel

您可能应该制作一个您的接口,UserDataModel以便您可以在单元测试中模拟或存根它。并使用 ninject 将该接口绑定到正确的实现,请参见示例。那么就不需要属性了。

Ninject MVC 文档

好的mvc例子

UserDataModels 列表不是依赖项。IE 您有某种数据库或其他依赖项(WCF 服务、Web 服务、实体框架、nHibernate 等),用户来自哪里,这就是您的依赖项。



public UserRepository(EntityFrameworkContext context)
{
    //The entity framework context is the dependency that you don't want to test.
    _context = context;
}

public List GetAllUsers()
{
   return _context.Users.ToList();
}

于 2012-07-10T13:00:57.047 回答