0

私は最初のDIコンテナとしてNinjectを学んでいます。すべてのコンテナが同じような考えを持っていると思うので、ここに私の質問があります。

次の関数を持つ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 に答える