我正在创建一个示例应用程序来一起理解存储库和工厂方法模式,因为它将在更大的项目中使用。
我想要实现的是能够使网站使用不同的ORM工具。
例如,网站将实现LINQ to SQL和Ado实体框架工作类,然后使用工厂方法将使用其中一个ORM“使用配置值”来加载存储库对象中的数据。
我现在所拥有的内容如下:
interface IRepository : IDisposable
{
IQueryable GetAll();
}
interface ICustomer : IRepository
{
}
public class CustomerLINQRepository : ICustomer
{
public IQueryable GetAll()
{
// get all implementation using linqToSql
}
public void Dispose()
{
throw;
}
public IRepository GetObject()
{
return this;
}
}
public class CustomerADORepository : ICustomer
{
public IQueryable GetAll()
{
// get all implementation using ADO
}
public void Dispose()
{
throw new NotImplementedException();
}
public IRepository GetObject()
{
return this;
}
}
// Filling a grid with data in a page
IRepository customers = GetCustomerObject();
this.GridView1.DataSource = customers.GetAll();
this.GridView1.DataBind();
////
public IRepository GetCustomerObject()
{
return new CustomerLINQRepository(); // this will return object based on a config value later
}
但我可以感觉到有很多设计错误,希望你能帮助我弄清楚它是为了获得更好的设计。
答案 0 :(得分:4)
我的两分钱:
一个。我会添加通用基础存储库类。无论类型是什么,许多存储库操作都是相同的。它可以节省大量的打字。
B中。我不明白为什么你的存储库正在实现ICustomer接口。 数据对象的接口是一种很好的做法,但我认为您的存储库不应该实现它。
℃。如果您的数据对象有一个共同的实现,我会为它们创建一个基类,并限制存储库仅适用于该类型的派生类。
我会做那样的事情:
public interface IEntity
{
// Common to all Data Objects
}
public interface ICustomer : IEntity
{
// Specific data for a customer
}
public interface IRepository<T, TID> : IDisposable where T : IEntity
{
T Get(TID key);
IList<T> GetAll();
void Save (T entity);
T Update (T entity);
// Common data will be added here
}
public class Repository<T, TID> : IRepository<T, TID>
{
// Implementation of the generic repository
}
public interface ICustomerRepository
{
// Specific operations for the customers repository
}
public class CustomerRepository : Repository<ICustomer, int>, ICustomerRepository
{
// Implementation of the specific customers repository
}
用法:
CustomerRepository repository = new CustomerRepository();
IList<ICustomer> customers = repository.GetAll();
// Do whatever you want with the list of customers
这就是我使用NHibernate实现DAL的方式。你可以在“NHibernate in Action”中找到一些用法。
我还建议使用Matt建议的某种IoC控制器。
答案 1 :(得分:1)
我不确定GetWanted
的命名。您到底想要什么?该名称应该更具描述性,可能是GetCustomerRepository
?
GetCustomerObject
与GetWanted
相同吗?
throw
是什么?
答案 2 :(得分:1)
大部分看起来都不错。我有两点意见: