我很难使用存储库模式,是否可以创建两个存储库模式?一个用于产品,另一个用于订单?
我未能将这些存储库连接到数据库。我知道如何使用一个存储库,但有两个使用 IRepository,其中 T: Entity 我迷路了。问题是如果创建 ProductRepository 和 OrderRepository,我是否可以创建并且不会改变规则?
我很难使用存储库模式,是否可以创建两个存储库模式?一个用于产品,另一个用于订单?
我未能将这些存储库连接到数据库。我知道如何使用一个存储库,但有两个使用 IRepository,其中 T: Entity 我迷路了。问题是如果创建 ProductRepository 和 OrderRepository,我是否可以创建并且不会改变规则?
存储库模式广泛用于 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);
}
}
这样,您只需创建新的存储库及其接口,它将自动注入您的控制器。