3

サブクラス化できる汎用リポジトリを使用して、既存のリポジトリを合理化しようとしています。問題は、基本クラスのメソッドのいくつかを作成する方法がわからないことです。私は現在持っています:

public interface IRepository<T> : IDisposable where T : class
{
    IQueryable<T> GetAll();
    T GetSingle(int id);
    T GetSingle(string slug);
    void Save(T entity);
}

public class HGRepository<T> : IRepository<T> where T : class
{
    protected HGEntities _siteDB;
    protected IObjectSet<T> _objectSet;

    public HGRepository(HGEntities context)
    {
        _siteDB = context;
        _objectSet = _siteDB.CreateObjectSet<T>();
    }

    public IQueryable<T> GetAll()
    {
        return _objectSet;
    }

    public T GetSingle(int id)
    {
        return null;
    }

    public T GetSingle(string slug)
    {
        return null;
    }

    public void Save(T entity)
    {
        // code to save entity
    }

    public void Dispose()
    {
        _siteDB = null;
    }
}

私の混乱は私の方法GetSingle()Save()方法にあります。のタイプごとにわずかに異なる情報に依存する必要がありますT。私の非ジェネリックリポジトリからの例:

public Article GetArticle(int id)
{
    return _siteDB.Articles.SingleOrDefault(a => a.ArticleID == id);
}

public Article GetArticle(string slug)
{
    return _siteDB.Articles.SingleOrDefault(a => a.Slug == slug);
}

public void SaveArticle(Article article)
{
    if (article.ArticleID > 0)
    {
        _siteDB.ObjectStateManager.ChangeObjectState(article, System.Data.EntityState.Modified);
    }
    else
    {
        _siteDB.Articles.AddObject(article);
    }

    _siteDB.SaveChanges();
}

ご覧のとおり、記事には独自の特定のIDがあります。他のエンティティについても同じです(たとえば、ニュースアイテムにはNewsIDプロパティがあります)。

より具体的なバージョンに調整できる抽象的な基本メソッドを作成するにはどうすればよいですか?

4

1 に答える 1

3

メソッドの汎用パラメーターを設定できます。GetSingle

public interface IRepository<T> : IDisposable where T : class
{
    ....
    T GetSingle(Expression<Func<T, bool>> filter);
    void Save(T entity);
}

とでHGRepository<T>

public T GetSingle(Expression<Func<T, bool>> filter)
{
        return _objectSet.Where(filter).SingleOrDefault();
}

そして使用法:

IRepository<Article> rep = new HGRepository<Article>();
return rep.GetSingle(p => p.Slug == slug);

ジェネリックインターフェイス/リポジトリクラスがカバーしていない特定のシナリオがある場合は、ジェネリックインターフェイス/クラスを継承する新しいインターフェイス/クラスを作成できます。

public interface IArticleRepository : IRepository<Article>
{
   ...
}

public class ArticleRepository : HGRepository<Article>, IArticleRepository
{
   ...
}
于 2012-06-22T02:27:23.803 に答える