【发布时间】:2012-04-19 07:28:59
【问题描述】:
我正在努力创造以下情况:
首先,有几个 Linq to SQL Table 对象可以做几乎相同的事情。我们称它们为 products_something、products_somethingElse 等。
其次,有一个接口可以执行 Products DAO 的所有常用方法。首先,我尝试为所有产品只创建一个 DAO,因为我可以处理它在另一层(DAL)上的差异。但由于 Linq to SQL 需要强类型引用,我最终为每种类型的产品使用了一个 DAO。我真的不知道是否有可能做我之前提到的。
最后,我有一个 ProductsDaoFactory,它根据客户端(用户视图)选择实例化正确的 ProductDao。因为我不知道在运行时会选择哪种类型的产品,所以我创建了一个通用工厂来处理它。
代码如下:
public enum ProductEnum
{
SimpleProduct, ComplexProduct, RevisedProduct, BrokenProduct
}
public interface IProducts<T>
{
T GetProductById(int id);
IQueryable<T> GetAllProducts(string product_name, DateTime product_age);
//Several other common methods
}
public static class ProductFactory
{
//This won't compile because i have to set what's the type of the DAO i want
public static IProducts<T> GetProductDAO(ProductEnum product)
{
switch (product)
{
case ProductEnum.SimpleProduct:
return new SimpleProductDAO();
case ProductEnum.ComplexProduct:
return new ComplexProductDAO();
case ProductEnum.RevisedProduct:
return new RevisedProductDAO();
case ProductEnum.BrokenProduct:
return new BrokenProductDAO();
default:
break;
}
return null;
}
}
public class SimpleProductDAO : IProducts<SimpleProductDAO>
{
public SimpleProductDAO GetProductById(int id)
{
//Implementation
}
public IQueryable<SimpleProductDAO> GetAllProducts(string product_name, DateTime product_age)
{
//Implementation
}
}
问题是:我无法定义工厂方法的返回类型,因为它是通用的。我必须将它的类型传递给工厂,这只会打破工厂的想法。 那么,如何创建一个工厂方法来实例化接口的泛型类型?
【问题讨论】:
标签: c# linq-to-sql generics dao factory-pattern