自从我使用接口协方差的最后一个问题以来,我还没有遇到代码问题。今天,我采取了另一种方法来OLGAtherer架构,我发现巨大的(对我来说)障碍。我希望它的巨大的只有我,我会找到答案在这里:) OK,请检查了这一点:如何指向泛型抽象类?
我有抽象泛型类:
abstract class Repository<T> where T : Entity
这个类包含四种CRUD方法签名(加,插入等)和两个受保护的字段。我将创建的任何存储库都必须从此超类继承。我有一个像仓库,例如:
class BookRepository : Repository<Book>
现在我有DB类是负责对DB文件操作。这是我的问题。看看这个方法放在DB类:
void Add(List<Entity> enitites, Type entityType)
{
Repository<entityType> repo = EntitiesFactory(entityType);
repo.Add(entities);
}
我知道,上面的方法都不行,但是这个想象我的问题(希望) - 我想动态地创建指定类型的仓库,但我有不知道如何做到这一点。这一直是我的主要OOP问题 - 我可以编写继承(或接口的实现),但我不能使用这些继承的类。请向我澄清一下。先谢谢你。
帕维尔
我用你提供的线索,这就是我现在:现在
public void Add<T>(List<T> entities, string repoName) where T : Entity
{
Repository<T> repo = RepoFactory<T>(repoName, typeof(T));
repo.Add(entities);
}
private Repository<T> RepoFactory<T>(string repoName, Type t) where T : Entity
{
if (t == typeof(Book))
{
Repository<T> repo = (Repository<T>)((object)(new BookRepository(this.ConnectionString, repoName)));
}
return null;
}
RepoFactory是DB类(这是由方式,在这里某种桥梁) - 它应该移动到其他地方,但这不是一个主要问题。
首先,我不知道RepoFactory体是否以正确的方式实现 - 我想不是。
第二 - 我假设我会从其他类调用DB方法(比方说 - WindowsForm,为简单起见)。我将根据用户的选择调用添加参数T.这是我有问题并暂时修复它的情况,因为现在DB是可以的,但是如果我必须实现WindowsForm代码,我会再次遇到它(我认为) - 将来我会试着找出答案同样的问题,但在更高的层次上(DB以上) - 我希望你明白我... 我基本上是说,我不会知道如何动态调用添加方法,因为T将取决于用户的选择(OLGAtherer有成为Repository Manager,可以支持书籍和其他类型的集合)。如果用户尝试使用他的书集,我将不得不调用Add()方法。如果使用Comics集合,则添加()。我不想为每种类型的集合编写类,而是使用Add的一个调用来执行此操作。
如果你明白我的意思,你真的很好:)我的英语很烂,但我正在努力。 感谢您提供以前的答案,并提前感谢您提供更多答案。 Paweł
嗯,我想你想重新发明轮子。为什么当你有很多已经很好开发的替代品如NHibernate和Linq2Sql时,你可以编写自己的ORM? – Juliet 2010-11-19 20:01:20
'DB'听起来像一个上帝对象,'EntitiesFactory'听起来像一个服务定位器。你正在为自己设定一个无法维护的,不可测试的灾难。 – jason 2010-11-19 20:49:00
你好,我知道这可能看起来不是一个好主意 - 我仍然在学习,我知道OOP的掌握需要花费数年的时间。但是如果你看看我放在Sourceforge上的代码,我认为你会接受我创建的架构。无论如何,谢谢您的回复。 – skrzeczowas 2010-11-20 20:03:48