リポジトリ パターンを使用するのに苦労しています。リポジトリ パターンを 2 つ作成することはできますか? 1つは製品用、もう1つは注文用??
これらのリポジトリをデータベースに接続できませんでした。私は 1 つのリポジトリで作業する方法を知っていますが、T: Entity が失われている IRepository で 2 つを使用します。問題は、ProductRepository と OrderRepository を作成する場合、ルールを作成でき、揮発しないかどうかです。
リポジトリ パターンを使用するのに苦労しています。リポジトリ パターンを 2 つ作成することはできますか? 1つは製品用、もう1つは注文用??
これらのリポジトリをデータベースに接続できませんでした。私は 1 つのリポジトリで作業する方法を知っていますが、T: Entity が失われている IRepository で 2 つを使用します。問題は、ProductRepository と OrderRepository を作成する場合、ルールを作成でき、揮発しないかどうかです。
リポジトリ パターンは、DDD (ドメイン駆動設計) で広く使用されています。ここで確認できます: http://www.infoq.com/minibooks/domain-driven-design-quickly。この本もチェックしてください:http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215
あなたの質問に関して:
はい、複数のリポジトリを使用できます。この例では、nHibernate セッションを使用しています。
// crud operations
public abstract class Repository<T> : IRepository<T> where T : class
{
protected readonly ISession _session;
public Repository(ISession session)
{
_session = session;
}
public T Add(T entity)
{
_session.BeginTransaction();
//_session.SaveOrUpdate(entity);
_session.Save(entity);
_session.Transaction.Commit();
return entity;
}
//...
}
public interface IRepository<T>
{
T Add(T entity);
T Update(T entity);
T SaveOrUpdate(T entity);
bool Delete(T entity);
}
次に、私のリポジトリは次のようになります。
public class ProjectRepository : Repository<Project>, IProjectRepository
{
// Project specific operations
}
public interface IProjectRepository : IRepository<Project>
{
Project Add(Project entity);
Project Update(Project entity);
Project find_by_id(int id);
Project find_by_id_and_user(int id, int user_id);
//..
}
次に、Ninject を使用します。
Global.asax.cs
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}
次に、NinjectControllerFactory でモジュールをロードします。
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel kernel = new StandardKernel(new NhibernateModule(), new RepositoryModule(), new DomainServiceModule());
protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
//var bindings = kernel.GetBindings(typeof(IUserService));
if (controllerType == null)
return null;
return (IController)kernel.Get(controllerType);
}
}
Nhibernate モジュール:
public class NhibernateModule : NinjectModule
{
public override void Load()
{
string connectionString =
ConfigurationManager.ConnectionStrings["sqlite_con"].ConnectionString;
var helper = new NHibernateHelper(connectionString);
Bind<ISessionFactory>().ToConstant(helper.SessionFactory).InSingletonScope();
Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope();
}
}
次に、RepositoryModule で Ninject Conventions を使用して、すべてのリポジトリをそれらのインターフェイスに自動的にバインドします。
using Ninject.Extensions.Conventions;
public class RepositoryModule : NinjectModule
{
public override void Load()
{
IKernel ninjectKernel = this.Kernel;
ninjectKernel.Scan(kernel =>
{
kernel.FromAssemblyContaining<ProjectRepository>();
kernel.BindWithDefaultConventions();
kernel.AutoLoadModules();
kernel.InRequestScope();
});
}
}
そして最後に、基本的にコントローラーにリポジトリを挿入します。
public class projectscontroller : basecontroller { プライベート readonly IProjectRepository _projectRepository;
public projectscontroller(IProjectRepository projectRepository)
{
_projectRepository = projectRepository;
}
[AcceptVerbs(HttpVerbs.Get)]
[Authorize]
public ActionResult my()
{
int user_id = (User as CustomPrincipal).user_id;
var projectList = _projectRepository.find_by_user_order_by_date(user_id);
var projetsModel = new ProjectListViewModel(projectList);
return View("my", projetsModel);
}
}
このようにして、新しいリポジトリとそのインターフェイスを作成するだけで、コントローラーに自動的に挿入されます。