リポジトリを持っているとしましょう:
interface IRepo
{
Foo Get(int id);
void Add(Foo f);
}
さて、指定されたプロパティを持つものだけを持つことができるという要件がありますFoo
.... Id
明らかに、IRepo
SQL バックエンドを実装して主キーにマップFoo.Id
する場合、このようなものを無料で取得できます。おそらく何らかのPKViolationException
. しかし、これは実装固有になりつつあるため、このIRepo
実装を使用してそれらの例外をキャッチし始めると、疎結合の利点が失われます。
さて、どうすればこれを修正できますか?最初にオブジェクトが存在するかどうかを確認し、次にリポジトリに依存しない例外をスローするサービス層を追加する必要がありますか?
class Service
{
IRepo repo;
public void AddFoo(Foo foo)
{
if(repo.Get(foo.Id) != null)
repo.Add(foo);
else
throw new FooAlreadyExistsException(foo.Id);
}
}
repo.Add(foo)
特に特定の Id を持つオブジェクトがチェックの直後に (他のアクティビティによって) 追加された場合は例外がスローされる可能性があるため、このソリューションは悪いように思えます。
このようなIRepo
例外を念頭に置いて注意して実装する必要があるようです (SQL 実装の例でキャッチPKViolationException
して変換することができます) が、すべての実装がそのような仕様に従っFooAlreadyExistsException
ていることを確認するにはどうすればよいですか?IRepo
一般的に、これらの問題にどのように取り組んでいますか?