IRepository<T>
インタフェース、NewsRepository
クラス、News
エンティティを持つことで、私のレポジトリパターンの実装がほぼ完了しました。私が遭遇した問題は、一般的なメソッドをベースリポジトリクラスに抽象化しようとすることでした。インタフェース、ベース、コンクリートによるリポジトリパターンの実装方法
特定のLinq式が含まれているため、NewsRepository
のGetメソッドを抽象化する方法が見つかりませんでした。
私の質問はです:
1)どのように私はpublic T Get(int id)
方法は、基本クラスに抽象してくださいますか?私がこれまで行ってきた唯一の方法は、intの代わりにExpression<Func<T,bool>>
を渡すことですが、各サブクラスが依然としてそれぞれの場合にほぼ同じ式を渡す必要があるため、共通の振舞いを実際に抽象化しませんすなわちn => n.id == id
。
2)サブクラスのGetViolationsメソッドとmapメソッドをUpdateメソッドの基底クラスに渡すにはどうすればよいですか?私は、ソリューションがおそらく代理人を使用していると想像しますが、コンパイルする構文を取得できませんでした
これはコードの単純化されたセットです - 実際は私は更新だけでなく更新ここに表示されます。
public interface IRepository<T>
{
T Get(int id);
void Update(T item);
}
public class NewsRepository : IRepository<News>
{
private Table<News> _newsTable;
public NewsRepository(string connectionString)
{
_newsTable = new DataContext(connectionString).GetTable<News>();
}
public News Get(int id)
{
return _newsTable.SingleOrDefault(n => n.NewsId == id);
}
public void Update(News item)
{
var errors = item.GetRuleViolations();
if (errors.Count > 0)
throw new RuleException(errors);
News dbNews = _newsTable.SingleOrDefault(n => n.NewsId == item.NewsId);
map(dbNews, item);
_newsTable.Context.SubmitChanges();
}
private void map(News dbNews, News news)
{
dbNews.Title = news.Title;
dbNews.Article = news.Article;
}
}
public class Repository<T> where T : class
{
protected Table<T> _table;
public Repository(Table<T> t)
{
_table = t;
}
//How do i do this??! - This doesn't compile due to T no having a NewsId
public T Get(int id)
{
return _table.SingleOrDefault(n => n.NewsId == id);
}
//This seems to be a solution, but it's not really abstracting common behaviour as each
//sub-class will still need to pass in the same linq expression...
public T Get(Expression<Func<T,bool>> ex)
{
return _table.SingleOrDefault(ex);
}
public void Update(T item)
{
//How is it possible to pass in the GetRuleViolations and map functions to this method?
var errors = item.GetRuleViolations();
if (errors.Count > 0)
throw new RuleException(errors);
T dbNews = _table.SingleOrDefault(n => n.NewsId == item.NewsId);
map(dbNews, item);
_table.Context.SubmitChanges();
}
}