私にとって、リポジトリパターンはデータアクセス方法論の周りに薄いラッパーを貼ることです。あなたのケースではLINQをSQLに変換しますが、NHibernateは他の人に手渡しします。私が自分自身でやっていることは、テーブルあたりのリポジトリを作成することです(これはbrunoリストのように非常に簡単です)。それは物事を見つけ、CRUD操作を行う責任があります。
しかし、私は、ヨハネスが言及しているように、集約根をより多く扱うサービスレベルを持っています。 GetExistingUser(int id)のようなメソッドを持つUserServiceがあります。これは内部的にUserRepository.GetById()メソッドを呼び出してユーザーを取得します。あなたのビジネスプロセスでGetExistingUser()によって返されたユーザークラスが、ほとんど常にUser.IsInRoles()プロパティを満たす必要がある場合は、UserRepository と RoleRepositoryの両方に依存します。
public class UserRep : IUserRepository
{
public UserRep(string connectionStringName)
{
// user the conn when building your datacontext
}
public User GetById(int id)
{
var context = new DataContext(_conString);
// obviously typing this freeform but you get the idea...
var user = // linq stuff
return user;
}
public IQueryable<User> FindAll()
{
var context = // ... same pattern, delayed execution
}
}
個人的に私は、リポジトリのクラスが内部スコープになるだろう:SQLビットにあなたのLINQでこのような何かを構築することでしょう
public class UserService
{
public UserService(IUserRepository userRep, IRoleRepository roleRep) {...}
public User GetById(int id)
{
User user = _userService.GetById(id);
user.Roles = _roleService.FindByUser(id);
return user;
}
userRepとroleRep:擬似コードでは、このようなものを見ることができますUserServiceと他のXXXXXServiceクラスを公開して、サービスAPIの消費者を正直に保つようにしてください。だから、私はリポジトリがデータストアとの会話の行為と密接に関連していると見ていますが、サービス層はビジネスプロセスのニーズにより密接に関連しています。
実際に必要なものを吐き出すサービスメソッドを構築するのではなく、オブジェクトとそのすべてのものに対するLinqの柔軟性を本当に思っていることがよくあります。などユーザーLINQは適切な場所ですが、リポジトリにすべての作業を行わないようにしてください。
public IList<User> ActiveUsersInRole(Role role)
{
var users = _userRep.FindAll(); // IQueryable<User>() - delayed execution;
var activeUsersInRole = from users u where u.IsActive = true && u.Role.Contains(role);
// I can't remember any linq and i'm type pseudocode, but
// again the point is that the service is presenting a simple
// interface and delegating responsibility to
// the repository with it's simple methods.
return activeUsersInRole;
}
だから、少しばかりだった。私が本当に助けてくれたかどうかはわかりませんが、私のアドバイスは、拡張メソッドで余りにも気にならないようにすることです。私のために働く。
さて、そこに行くよ。毎日何かを学ぶ。私自身のアプローチを調整する必要があります:-) – Dylan
うん。私はこの答えで何かを学びます。私はいくつかのリポジトリを持つことが理にかなっていたが、各リポジトリが集約の周りに構築されるべきであることを知らなかった。完全に意味をなさない –
優秀な投稿。 –