0

リポジトリ パターンを使用するのに苦労しています。リポジトリ パターンを 2 つ作成することはできますか? 1つは製品用、もう1つは注文用??

これらのリポジトリをデータベースに接続できませんでした。私は 1 つのリポジトリで作業する方法を知っていますが、T: Entity が失われている IRepository で 2 つを使用します。問題は、ProductRepository と OrderRepository を作成する場合、ルールを作成でき、揮発しないかどうかです。

4

1 に答える 1

0

リポジトリ パターンは、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);
}

}

このようにして、新しいリポジトリとそのインターフェイスを作成するだけで、コントローラーに自動的に挿入されます。

于 2014-07-09T09:50:57.507 に答える