【问题标题】:Generics - Passing instances as a base type泛型 - 将实例作为基本类型传递
【发布时间】:2015-04-09 06:56:31
【问题描述】:

我目前正在为我们的新应用程序开发数据访问层,它不是一个大型应用程序,所以我决定使用 Dao 模式,将每个模型项转换为一个 Dao 项,然后再将其存储到数据库中存储的查询。

尽可能多地使用通用接口和抽象类来删除重复操作,但现在我遇到了一些障碍。

我们有一个用于 Dao 转换类的接口,如下所示:

internal interface IDaoConverter<TModel, TDao>
    where TModel : ModelItem
    where TDao : DaoItem
{
    ToDao(TModel inModel);
    inDao);
}

到目前为止,这工作正常并且适合它的功能,您在类定义中指定模型类型和它将转换为(1-1 关系)的 Dao 类型,并创建函数以匹配这些类型。这些道转换器的实例被保存在工厂中,以便于检索。

接下来我想要创建将使用它的数据访问类,并且我想以通用方式设计它。

我追求的是一种向 Dao Converter Factory 询问我想要一个可以处理特定类型的 Model 项目的 Dao Converter 但到目前为止我找不到指定它的方法。

public abstract class AbstractDataAccess<T> where T: ModelItem
{
    protected IDaoConverter<T,?> Converter;

    public void Init(IDaoConverter<T,?> inConverter)
    {
        Converter = inConverter;
    }
}

我基本上希望能够在课堂上用我想要的任何类型替换问号。由于这个原因,我目前不得不完全写出每个数据访问类。

【问题讨论】:

  • 为什么不使用 AutoMapper?
  • 您在界面上使用泛型,但是...如果您明确告诉 TDaoDaoItem 类,为什么不使用 @987654326 之类的方法将其声明为 internal interface IDaoConverter&lt;TModel&gt; @?
  • AutoMapper 是这种情况下的绝佳选择,可以减少从 Model 转换为 DAO 或 DTO 的样板
  • @HuorSwords 我的目标是坚持强类型参数,我只是将它们指定为 DaoItem 类型,但是采用特定类型 DaoItem 的数据库函数也需要失去它们的强类型。
  • @Peyman 我们从来没有真正看过 AutoMapper,但我会试着找点时间。谢谢

标签: c# templates generics


【解决方案1】:

如果在初始化时给出转换器,您可以将访问 DaoConverter 的方法设为抽象,并派生一个(可能是抽象的)类,该类具有表示 Dao-Type 的第二个类型参数。

public abstract class AbstractDataAccess<T, TDao> : AbstractDataAccess<T> where ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2019-02-27
    • 2017-12-23
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多