Методология обработки данных ADO EF - PullRequest
0 голосов
/ 19 октября 2011

Я надеялся, что кто-нибудь может указать мне направление рефакторинга некоторых из моих методов для принятия универсальных типов.

У меня есть служба, которая поддерживает множество разных таблиц в моей базе данных.Большинство таблиц имеют одинаковый формат.Служба выполняет одинаковые основные операции над всеми таблицами: GetAll, Save, Delete.Поскольку операция та же самая, я искал способ создания базовой библиотеки действий.

Это пример моей функции сохранения, единственное различие между этой и другими таблицами состоит в данных.Итак, вот его ClientData, а на следующем - его GroupData ...

internal static void SaveClient(ClientData clientData)
        {
            using (CFOEntityModelContainer database = new CFOEntityModelContainer())
            {
                if (!IsClientValid(clientData.Id))
                {
                    database.Clients.AddObject(ConvertClientDataToClient(clientData));
                    database.SaveChanges();
                }
                else
                {
                    Client client = database.Clients.First(
                        c => c.Id == clientData.Id);

                    client.Name = clientData.Name;

                    database.SaveChanges();
                }
            }
        }

Предложения?

1 Ответ

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

Как вы ожидаете сделать его универсальным, если ваш метод содержит специфичные для типа операции?У вас всегда есть сущность XXX и класс XXXData, где сущность XXX содержит Id и Name, а класс XXXData содержит Name и Id?Если бы не ваше общее сохранение, это был бы просто шаблон, принимающий делегатов для конкретного метода = без упрощения.Если да, вы можете сделать что-то вроде:

Сначала подготовьте интерфейс, используемый в универсальных методах:

public interface IData
{
    int Id { get; }
    string Name { get; set; }
}

Теперь реализуйте этот интерфейс в вашей сущности и классах данных и создайте универсальный метод:

internal static void Save<TEntity, TData>(TData data)
    where TEntity : class, IData
    where TData : class, IData
{
    using (CFOEntityModelContainer database = new CFOEntityModelContainer())
    {
        ObjectSet<TEntity> set = database.CreateObjectSet<TEntity>();

        // Here you have specific method - can you make it generic?
        // If not it must be another parameter (delegate) passed to Save method
        if (!IsValid(data.Id))  
        {
            // Convert is another specific method which must be generalize
            // This time it can be probably solved by overriding conversion
            // operator on each data implementation
            set.AddObject(Convert(data));
        }
        else
        {
            // Another specific logic - can you make it generic?
            // If not it must be passed as delegate
            TEntity entity = set.First(e => e.Id == data.Id);
            entity.Name = data.Name;
        }

        database.SaveChanges();
    }
}

Вы можете вызвать этот метод как:

Save<Client, ClientData>(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...