Вопрос

Предположим, я разрабатываю приложение для дистрибьютора продуктов на C #.

Дистрибьютор выполняет следующие 3 типа транзакций:

(1) Отступ

(2) Продать

(3) Фондовая

Я разрабатываю свои классы следующим образом:

public abstract class Transaction
{
}

public class Indent : Transaction
{
}

public class Sell : Transaction
{
}    

public class Stock : Transaction
{
}

Теперь, если я хочу сохранить эти три типа информации в трех отдельных таблицах, то как мне спроектировать слой DA?

Должен ли я создавать отдельные классы DA, такие как

(1) IndentDA
(2) SellDA
(3) StockDA

или отдельный класс TransactionDA и выполняйте операции CRUD, проверяя их типы с помощью операторов as / is ?

Или что еще я могу сделать? Есть предложения?

Это было полезно?

Решение

Во-первых, если вы создали один класс TransactionDA и проверили типы внутри класса для выполнения операций CRUD, вы бы нарушили Открытый / закрытый принцип , поэтому я бы точно не пошел по этому пути.

Что касается предложений о том, как выполнить построение DAL, я бы посоветовал следить за сообщениями в блогах о людях, которые намного умнее меня, о том, что они думают об этой теме.

Хранилище - это новый синглтон

Репозиторий мертв: Да здравствует репозиторий

Ночь живых хранилищ

Разговор, я полагаю, продолжается, но с этого следует начать.

Другие советы

Я бы использовал ORM, такой как NHibernate, и использовал его возможности наследования нескольких таблиц, и тогда мне не пришлось бы об этом беспокоиться.

Я бы использовал здесь подтипы сущностей. Создайте одну таблицу для транзакций (и, как сказал более ранний автор, возможно, лучше использовать другой термин) и сохраните там все, что часто встречается. Затем создайте один " подтип " таблица для каждой специализации. Эти таблицы подтипов должны иметь тот же первичный ключ, что и основная таблица («сильная» сущность) и поля, которые являются уникальными для этой конкретной специализации. Каждый подтип связан с сильной сущностью взаимно-однозначно, с необязательным участием на стороне подтипа и обязательным участием на стороне сильной сущности.

Затем, чтобы упростить запросы, определите представление, которое (внешний) объединяет сильную сущность со всеми подтипами сущности, чтобы вы могли легко "см." все.

Вот простой (и распространенный) пример того, как это настроить:

create table Employee (
  eid        int primary key,
  first_name text,
  last_name  text not null
)

create table Salaried (
  eid             int primary key,
  annualSalaryUSD money not null
)

create table Hourly (
  eid             int primary key,
  hourlyRateUSD   money not null
)  

Если вы знаете, что ваши данные собираются в три отдельные таблицы, то у меня обычно было бы три отдельных класса DA.

Однако, если ваши таблицы практически одинаковы, вы можете обобщить TransactionDA и упростить уровень данных. Я сделал бы это только в том случае, если вы знаете, что у вас будет большой объем транзакций и вы собираетесь разделять ваши таблицы на разные файлы или что-то в этом роде, в противном случае я бы, вероятно, просто упростил бы все и соединил все это.

Не пытайтесь создать TransactionDA, если все ваши отдельные типы транзакций чрезвычайно похожи.

Вы можете использовать внедрение зависимостей, создать класс DA для каждого и заставить их всех реализовывать один и тот же интерфейс ITransactionDA с вашими операциями CRUD.

public interface ITransactionDA
{
  void Read();
  void Update();
...
}

public class StockDA : ITransactionDA
{
  //implement interface methods
}

Stock stock = new Stock(new StockDA());

Я сделаю что-то подобное

public abstract class DistributerTransaction
{
    DistributerDA dataaccess;
}
public class Indent : DistributerTransaction
{
}
public class Sell : DistributerTransaction
{
}
public class Stock : DistributerTransaction
{
}

public abstract class DistributerDA
{
   /*Read();
     Update();*/
}
public class IndentDA : DistributerDA
{
}
public class SellDA : DistributerDA
{
}
public class StockDA : DistributerDA
{
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top