ORM с классами сущностей и доменными интерфейсами / классами - PullRequest
0 голосов
/ 24 мая 2011

Я пытаюсь решить, как обрабатывать классы и интерфейсы на уровне домена в отношении объектов, заполненных через ORM (в данном случае NHibernate). Я разработал очень простой сценарий, который помогает проиллюстрировать мою текущую ситуацию.

public interface ICar
{
    public bool PassesEmisionStandards(string state);
    public int Horsepower { get; set; }
    public string Model { get; set; }
}

public class CarFromDB
{
    public int Horsepower { get; set; }
    public string Model { get; set; }
}

public class ModelT : CarFromDB, ICar
{
    public bool PassesEmissionStandards(string state)
    {
        return false;
    }

    public override string ToString()
    {
        return Model + " with " + Horsepower + " ponies";
    }
}

В этом случае CarFromDB - это класс, который получил отображение через NHibernate в мою базу данных. ICar - это интерфейс, который обрабатывает мой код пользовательского интерфейса / контроллера. ModelT - это один из классов, экземпляры которых передаются в пользовательский интерфейс.

В моем реальном домене PassesEmissionStandards - это сложный метод, который значительно отличается среди различных производных классов, а класс CarFromDB имеет дюжину простых свойств наряду со ссылками на другие классы, как по отдельности, так и в списках. Эта информация используется в эквиваленте PassesEmissionStandards.

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

  1. Украсьте CarFromDB с помощью ICar и попытайтесь найти чистый способ реализовать в нем обширный метод PassesEmissionStandards или обратиться к другим классам за помощью
  2. Используйте AutoMapper или эквивалентную + фабрику, чтобы преобразовать мои объекты базового класса в объекты производного класса
  3. Поскольку тип производного класса можно определить по свойству базового класса, сопоставьте производные классы для NHibernate и найдите способ подключиться к NHibernate, чтобы указать, какой из производных классов следует использовать.

Я чувствую, что это, должно быть, очень распространенная проблема, но я искал SO и другие места, не найдя каких-либо твердых указаний. Обратите внимание: я относительно новичок в области ORM и моделирования доменов и очень плохо знаком с NHibernate. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 мая 2011

Не думаю, что понимаю вашу проблему, почему вы не можете использовать:

public interface ICar
{
    public bool PassesEmisionStandards(string state);
    public int Horsepower { get; set; }
    public string Model { get; set; }
}

public abstract class CarBase : ICar
{
    public int Horsepower { get; set; }
    public string Model { get; set; }
    public abstract bool PassesEmisionStandards(string state);
}

Или, если CarBase используется также для всех производных классов, вы можете использовать шаблон стратегии

public interface IEmissionCalculator
{
    void Calculate(IEmissionCalculatorContext context);
}

public CarBase : ICar
{
    internal void Assign(IEmissionCalculator calculator){}

    public bool PassesEmisionStandards(string state)
    {
        //assign all info needed for calculations
        var ctx = new IEmissionCalculatorContext {  };
        return _calculator.Check(ctx);
    }
}

Вы можете использовать один и тот же класс DB, но назначать разные расчеты выбросов в зависимости от типа автомобиля.

Если это тоже не сработает, я бы использовал automapper.

...