skr*_*was 1 c# oop generics inheritance class
自从我上一次使用接口协方差问题以来,我没有遇到代码问题.今天我采用了另一种OLGAtherer架构的方法,我发现了巨大的(对我来说)障碍.我希望它只对我很大,我会在这里找到答案:)好的,请检查一下:
我有抽象的泛型类:
abstract class Repository<T> where T : Entity
Run Code Online (Sandbox Code Playgroud)
此类包含四个CRUD方法(添加,插入等)和两个受保护字段的签名.我将创建的任何存储库都必须从此超类继承.我有一些存储库,例如:
class BookRepository : Repository<Book>
Run Code Online (Sandbox Code Playgroud)
现在我有类DB负责DB文件的操作.而且有我的问题.看看放在DB类中的这个方法:
void Add(List<Entity> enitites, Type entityType)
{
Repository<entityType> repo = EntitiesFactory(entityType);
repo.Add(entities);
}
Run Code Online (Sandbox Code Playgroud)
我知道上面的方法不起作用,但这可视化我的问题(希望) - 我想动态创建指定类型的存储库,但我不知道如何做到这一点.这一直是我的主要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;
Run Code Online (Sandbox Code Playgroud)
}
RepoFactory现在在DB类中(顺便说一句,这里是某种类型的Bridge) - 它应该被移动到其他地方,但这不是一个主要问题.
首先,我不知道RepoFactory的身体是否以正确的方式实施 - 我猜不是.
第二 - 我假设我将从其他类调用DB方法(比方说 - WindowsForm,为简单起见).我将使用参数T调用Add,具体取决于用户的选择.这是我遇到问题并暂时修复它的情况,因为现在DB正常,但是如果我必须实现WindowsForm代码,我将再次遇到它(我想) - 将来我会试着找出答案同样的问题,但是在更高层次(上面的DB) - 我希望你理解我...我基本上是说,我不知道如何动态调用Add方法,因为T将依赖于用户的选择(OLGAtherer必须是Repository Manager,它将支持Books和其他类型的集合).如果用户尝试使用他的图书集,我将不得不调用Add()方法.如果使用Comics集合,则添加().我不喜欢
如果你理解我的意思,你真的很好:)我的英语很糟糕,但我正在努力.感谢您以前的回答,并提前感谢您的回答.帕维尔
我不太清楚你想要什么.这会吗?
void Add<T>(List<T> entities) where T : Entity
{
Repository<T> repo = EntitiesFactory(typeof(T));
repo.Add(entities);
}
Run Code Online (Sandbox Code Playgroud)
此外,我建议您尽可能灵活地使用输入参数,例如使用IEnumerable<T>而不是使用List<T>此方法以及Repository<T>.Add()方法.您可能希望传入一个延迟评估的查询,或将多个LINQ方法链接在一起.
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |