是的 - 我相信这是可能的。
关键是如何处理您的存储库。
例如,每个 Repository 应该接受一个 Context .. 所以只需创建一个上下文并将其传递给每个存储库。
(请输入代码!)很高兴你问:)
public interface IOrderRepository
{
IQueryable<Order> FindAll();
}
public interface IOperationLogRepository
{
IQueryable<OperationLog> FindAll();
}
public interface IUnitOfWork
{
void Commit();
}
.
public class SqlServerContext : ObjectContext, IUnitOfWork
{
public void SqlServerContext(string connectionString)
: base(connectionString)
{
}
public void Commit()
{
this.SaveChanges();
}
// Your other POCO's and stuff here ..etc..
}
.
public class OrderRepostiory : IOrderRepository
{
private readonly SqlServerContext _sqlServerContext;
public void OrderRepostiory(SqlServerContext sqlServerContext)
{
_sqlServerContext = sqlServerContext;
}
public IQueryable<Order> FindAll()
{
_sqlServerContext.Orders;
}
}
.. 最后,实例化。因为你是一个好男孩/女孩/彩虹独角兽,你会使用依赖注入..
public class SqlServerRegistry : Registry
{
public SqlServerRegistry(string connectionString)
{
For<SqlServerContext>()
.HybridHttpOrThreadLocalScoped()
.Use<SqlServerContext>()
.Ctor<string>("connectionString")
.Is(connectionString);
For<IOrderRepository>().Use<OrderRepository>();
For<IOperationLogRepository>().Use<OperationLogRepository>();
}
}
并且因为SqlServerContext 被定义为HttpOrThreadLocal,它将被实例化一次并在多个Repositories 中重用。
不知道或不了解 DI/IoC ?
那么这也可以工作....
private SqlServerContext _sqlServerContext;
private IOrderRepository _orderRepository;
private IOperationLogRepository _operationLogRepository;
[TestInitialize]
public void TestInitialise()
{
_sqlServerContext = new SqlServerContext(
ConfigurationManager.AppSettings["connectionString"]);
_orderRepository = new OrderRepository(_sqlServerContext);
_operationLogRepository= new OperationLogRepository(_sqlServerContext);
}
[TestMethod]
public void SomeTest()
{
// Arrange.
const int count = 10;
// Act.
var orders = _orderRepository.FindAll().Take(10).ToArray();
// Assert.
Assert.IsNotNull(orders);
CollectionAssert.AllItemsAreNotNull(orders);
Assert.AreEqual(count, orders.Length);
}
再一次,这是我刚刚输入的所有未经测试的代码,因为我正在考虑回答这个问题。
HTH。