1

現在、最初のasp.net mvc アプリケーションに取り組んでいます。私が見ているすべてのサンプル プロジェクトのクールエイドを飲み込もうとしており、リポジトリ デザイン パターンを使用しようとしています。

次のような IUserRepository というインターフェイスがあります。

public interface IUserRepository
{
    IUser Add(IUser user);
    IQueryable<IUser> Fetch();
    IUser Update(IUser obj);
    void Delete(IUser obj);
}

私の IUser インターフェイスには、CreatedBy、CreatedDate、ModifiedBy、および ModifiedDate の一連のプロパティとプロパティがあります。

私の UserRepository は次のようになります。

public class UserRepository : IUserRepository
{
    private GimliDataContext db = null;

    public UserRepository()
    {
        db = new GimliDataContext();
    }

    public UserRepository(string connection)
    {
        db = new GimliDataContext(connection);
    }

    public IUser Add(IUser obj)
    {
        db.Users.InsertOnSubmit((User)obj);
        db.SubmitChanges();
        return obj;
    }

    public IQueryable<IUser> Fetch()
    {
        return db.Users.Select(b => b as IUser);
    }

    public IUser Update(IUser obj)
    {
        var user = db.Users.Where(u => u.UserId == obj.UserId).Single();
        user.Name = obj.Name;
        user.Password = obj.Password;
        user.Email = obj.Email;
        user.IsLocked = obj.IsLocked;
        user.IsDisabled = obj.IsDisabled;
        db.SubmitChanges();
        return user;
    }

    public void Delete(IUser obj)
    {
        var user = db.Users.Where(u => u.UserId == obj.UserId).Single();
        db.Users.DeleteOnSubmit(user);
        db.SubmitChanges();
    }
}

現在の Web アプリケーションでは、ユーザーがログインするときに顧客のビジネス プリンシパルを現在のスレッドに隠し、ビジネス オブジェクトが更新されると、現在のビジネス プリンシパルの Identity プロパティで Name プロパティを使用するだけでうまく機能します。

それで私の質問は何ですか?リポジトリの Add メソッドまたは Update メソッド内で同じことを行う必要がありますか、または実際に現在のユーザーへの IUser 参照を渡し、そこから UserId を取得する方がよいでしょうか?

ご意見をお待ちしております。

4

1 に答える 1

2

まず、リポジトリ インターフェイスを汎用にすることをお勧めします。IUserRepository の代わりにこれを試してください:

public interface IRepository<T>
{
    T Add(T entity);
    IQueryable<T> Fetch();
    T Update(T entity);
    void Delete(T entity);
}

そうすれば、このインターフェースを任意のドメイン モデルに使用できます。

あなたの質問 (CreadedBy および ModifiedBy 小道具) に関する限り、個人的には、それはビジネス ロジックのように聞こえ、Service クラス内により適しています。でも、最初に言った通りにします。ID を取得するために別の IUser を渡す代わりに、現在認証されているユーザーのユーザー ID を取得してそこに入力します。しかし、それがサービス内にある場合は、実際にシステムにログインする手間をかけずに、単体テスト用に別のサービスをモックアップできます (モックされたサービスにモック IUser を提供させる)。

私自身はこれに少し慣れていないので、より良い提案があれば、それらについても読みたいと思います.

于 2008-11-22T19:44:34.000 に答える