我的存储库设置如下所示。
interface IRepository<T> where T : DataRow
{
T Get(int key);
}
interface ICartonRepository : IRepository<CartonDataRow>
{
}
class CartonRepository : ICartonRepository
{
public CartonDataRow Get(int key)
{
}
}
我还有一个PackRepository,其定义方式与CartonRepository相同。我想做的是以下内容。
IRepository<DataRow> repository;
switch (rowType)
{
case Carton:
repository = new CartonRepository();
break;
case Pack:
repository = new PackRepository();
break;
}
有没有办法实现这个目标?
答案 0 :(得分:0)
interface IRepository<out T> where T : DataRow
{
T Get(int key);
}
这需要C#4.0。
答案 1 :(得分:0)
您需要某种Factory pattern。
以下逻辑应该转到工厂类
class RepositoryFactory
{
IRepository<T> Get(rowType)
{
IRepository<T> repository = default(IRepository<T>);
switch (rowType)
{
case Carton:
repository = new CartonRepository();
break;
case Pack:
repository = new PackRepository();
break;
}
return repository;
}
}
您可以使用Dependency Injection或基于维护dictionary.
中的所有存储库来进一步改进获取方法答案 2 :(得分:0)
对于C#3.5,您必须添加以下内容:
public interface IRepository {
DataRow Get(int key);
}
public abstract class Repository<T> : IRepository<T>, IRepository
where T : DataRow
{
public abstract T Get(int key);
DataRow IRepository.Get(int key) {
return this.Get(key);
}
}
然后将CartonRepository
更改为class CartonRepository : Repository<CartonDataRow>
(我认为您不需要ICartonRepository
,但如果您愿意,可以使用它)。然后
IRepository repository;
switch (rowType)
{
case Carton:
repository = new CartonRepository();
break;
case Pack:
repository = new PackRepository();
break;
}