0

我很难使用存储库模式,是否可以创建两个存储库模式?一个用于产品,另一个用于订单?

我未能将这些存储库连接到数据库。我知道如何使用一个存储库,但有两个使用 IRepository,其中 T: Entity 我迷路了。问题是如果创建 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

关于你的问题:

是的,您可以使用超过 1 个存储库。看这个例子,我使用 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);
//..
}

然后使用忍者:

全球.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);
        }
    }

休眠模块:

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();                

            });

       }
    }

最后我基本上在控制器中注入了 Repository:

公共类项目控制器:基本控制器{私有只读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 回答