C#泛型继承数据访问

4

嗨,我想创建一个基类来继承,但是遇到了一些问题。

我有两个类,它们几乎具有相同的功能,但从不同的数据库获取数据,并使用不同的内部数据结构来操作这些数据。 我想在基类中有一个虚拟的doSomething方法,最好还有一个虚拟的dataAccess方法。

第二个问题可以通过使用泛型来解决,但我无法使用泛型来解决第一个问题,因为我使用的DBMl上下文的构造函数不是无参的。

我是错了吗?我试图做到DRY,但似乎是在违反继承原则。

下面是示例代码。

class Foo    {
private _ctx DBML.Database1; // Inherits from System.Data.Linq.DataContext

public Foo(string constring)    {
    _ctx = new DBML.Database1(constring);
}

private DoSomeThing()   {

    FooDataObj = DataAccess(1);
}

private FooDataObj DataAccess(int ID)
{
    var v = from t in _ctx
            where t.Id = ID
            select new FooDataObj(t);

    return v
}
}

class Bar    {
private _ctx DBML.Database2; // Inherits from System.Data.Linq.DataContext

public Bar(string constring)
{
    _ctx = new DBML.Database2(constring);
}

private DoSomeThing()   {

    BarDataObj = DataAccess(1);
}

private BarDataObj DataAccess(int ID)   {
    var v = from t in _ctx
            where t.Id = ID
            select new BarDataObj(t);

    return v
}
}

你似乎需要一个工厂来创建具有共同接口/基类的上下文。 - CodingBarfield
你实际上想要实现什么? - Just Me
2个回答

2

FooBar不应该自己调用数据库构造函数,数据库对象应该是构造函数的参数(而不是连接字符串)。这个原则被称为依赖注入,它将解决大部分你的问题。然后可以很容易地创建一个新的通用类DataObjFactory<DataObjType>来替代Foo和Bar。


0
你应该创建一个基类来封装你想要共享的功能。在这种情况下,如果你在实体对象上使用接口,你可以重用数据访问代码。像这样:
interface IUniqueEntity
{
  int ID { get; }
}

abstract class FooBarBase<TEntity>
  where TEntity : class, IUniqueEntity
{
  private DataContext _ctx;

  public Foo(DataContext context)    {
      _ctx = context;
  }

  protected abstract DoSomeThing();

  protected TEntity DataAccess(int ID)
  {
      return _ctx.GetTable<TEntity>()
        .First(e => object.Equals(e.ID, ID);
  }
}

然后您可以将IUniqueEntity接口应用于您的Foo/BarDataObj,并从FooBarBase继承您的Foo/Bar类:

class Foo : FooBarBase<FooDataObj> {
  public Foo(DBML.Database1 context) : base(context)  {
  }

  protected override DoSomeThing()   {
      var myobj = DataAccess(1);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接