C # Generics Inheritance Доступ к данным - PullRequest
4 голосов
/ 12 октября 2011

Привет! Я хочу создать базовый класс для наследования, но у меня возникли некоторые проблемы.

У меня есть два класса, которые выполняют практически одинаковую работу, но получают данные, с которыми работают, из разных баз данных и используют разные внутренние структуры данных для манипулирования данными.Я хочу иметь виртуальный метод doSomething в базе и в идеале виртуальный метод dataAccess также в базе.

Вторая проблема может быть решена путем использования обобщений, но я не могу использовать обобщения для решения первой проблемы, так как конструктор контекста DBMl, который я использую, не без параметров.

Я все об этом говорю неправильно.Я пытаюсь быть СУХИМ, но, похоже, работаю против наследования.

Пример кода ниже.

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
}
}

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Foo и Bar не должны вызывать конструктор базы данных сами по себе, объект базы данных должен быть параметром конструктора (вместо строки соединения).Этот принцип называется инъекцией зависимостей и решит большинство ваших проблем.Должно быть легко создать новый универсальный класс DataObjFactory<DataObjType> в качестве замены для Foo и Bar.

0 голосов
/ 12 октября 2011

Вы должны создать базовый класс, который включает в себя функциональность, которой вы хотите поделиться.В этом случае вы можете повторно использовать код доступа к данным, если вы используете интерфейс для вашего объекта.Примерно так:

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 и наследовать ваши классы Foo / Bar от FooBarBase:

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

  protected override DoSomeThing()   {
      var myobj = DataAccess(1);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...