您可以利用存储库使用每种数据访问技术。 存储库是对现有数据访问助手/服务的抽象,允许将业务逻辑与数据访问层分离。存储库与Query一起使用来启用筛选。它通常与工作单元一起使用,以将更改存储回数据库。
存储库具有至少:
- GET-对象通过键操作(多个)
- GET-所有对象操作
- GET-第一物体通过查询操作( S)
- 找对象,通过查询操作(S)
一个很简单的例子:):
A. 产品类,在常见定义:
public class Product
{
public int Id { get; private set; }
public string Code { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
为查询,IRepository和IUnitOfWork B.类中定义DAL.interfaces.dll或常见.dll(但不在DAL!)。
public class Query
{
public string Text { get; set; }
}
public interface IRepository<TEntity>
where TEntity : class
{
bool TryGet(int key, out TEntity value);
TEntity this[int key] { get; }
IEnumerable<TEntity> GetAll();
bool TryGetFirst(Query condition, out TEntity value);
TEntity GetFirst(Query condition);
IEnumerable<TEntity> GetAll(Query condition);
int Count { get; }
}
public interface IUnitOfWork
{
void SetAdded(TEntity value); // Marks entity as added for further INSERT
void SetRemoved(TEntity value); // Marks entity as removed for further DELETE
void SetChanged(TEntity value); // Marks entity as modified for further UPDATE
void Save(); // Save all the changes
}
IUnitOfWork意识到了改变的实体。保存()为每个更改的实体调用适当的DatabaseHelper/OdbcHelper CRUD方法,以便将更改保留在数据库中。
IRepository <产品> ... IRepository <EntityXY>和IUnitOFWork的实施应放置在DAL。 BLL然后使用IR知识库和IUnitOFWork以实现业务(域)逻辑。 BLL本身可以被组织为服务层,位于域模型的顶部,但它超出了讨论的范围:)。
我希望我的回答有帮助。
请随时问我一个问题...
链接: Patterns of enterpise application architecture by Martin Fowler
我们使用实体/对象在M(模式)时,我们要揭露他们的一个观点。否则,我们现在将它们放入一个单独的Domain类库中。但是如何使用存储库设计?并在哪里把数据库调用(通用和数据库特定)?也许它只是一个命名的东西,但欢迎你! – jpderooy 2011-02-08 13:34:04
存储库只不过是在您的DAL类上使用任何数据库技术而不同。我不想深入了解Repository与DAL类的不同之处,这是一个简单的谷歌查询。但实质上,它们服务于类似的目的。否则,您仍然会在您的控制器中创建一个BLL类的实例,这反过来会创建一个Repository实例,最终将实体一直返回用作MVC中的M. – e36M3 2011-02-08 13:37:34