LINQ, Полиморфизм, MetaDataMapping, Inheritance Mapper - PullRequest
0 голосов
/ 19 октября 2008

Я пишу небольшую программу. Интерфейс, который я пишу для управления каждым созданным репозиторием, определяет метод Save (IPublicObject). Я использую LINQ для SQL-версии репозитория CRUD. У меня вопрос такой. Я хотел бы иметь только один метод, который принимает тип интерфейса. Я хочу подумать, как мне лучше всего найти действие Сохранить для унаследованного типа, который я затем передам.

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

public class ConcretePublicObjectOne : IPublicObject{}

Затем я хочу передать это в функцию сохранения репозитория. Именно в этот момент я пытаюсь придумать, как лучше сказать, хорошо, нам нужно использовать «ЧТО?» Метод сохранения и т.д ...

Должен ли я использовать реестр, параметры конфигурации, отображающие типы?

Ответы [ 3 ]

3 голосов
/ 19 октября 2008

Для LINQ-to-SQL контекст данных уже делает многое для вас. Таким образом, я думаю, что дженерики могли бы быть лучшим способом достижения сохранения, при этом все еще имея некоторое рассмотрение вашего интерфейса (хотя я не совсем уверен, что интерфейс дает вам в этом сценарии ...).

Вы можете получить доступ к общему аспекту контекста данных через GetTable<T>():

    static void Save<T>(T item)
        where T : class, IPublicObject
    {
        using (DataContext ctx = GetDataContext())
        {
            Table<T> table = ctx.GetTable<T>();
            // for insert...
            table.InsertOnSubmit(item);
            // for update...
            table.Attach(item, true);
            // for delete...
            table.DeleteOnSubmit(item);

            ctx.SubmitChanges();

        }
    }

Обратите внимание, что вывод типа должен означать, что вам не нужно указывать T при сохранении:

    Foo foo = new Foo();
    Save(foo); // <Foo> is inferred

Это какое-то использование?

0 голосов
/ 20 октября 2008

Марк Гравелл:

Спасибо за это. Как я уже сказал, хотя я думаю, что, используя ваш пример, мне придется придерживаться моделей, которые я получаю из текста данных, который как бы связывает меня с LINQ.

То, что вы сделали, - это именно то, что я ищу. Он находит тип на основе объекта, а затем знает, какое действие совершить. Используя ваш пример, могу ли я использовать анонимные типы, чтобы применить преобразование к моим моделям для работы с этим кодом linq. У меня есть разные хранилища, которые вы видите, и мне нужны модели для работы по всем направлениям. Модели как бы самодостаточны и ничего о них не знают, лол.

0 голосов
/ 19 октября 2008

То, что вы хотите сделать, это иметь:

Repository.Save(publicObject)

а хранилище для вызова метода из publicObject?

Если это требование, вы можете определить метод Save в репозитории как:

public class Repository {
    public void Save(IPublicObject publicObject) {
        publicObject.Save();
    }
}

, где IPublicObject определен как:

public interface IPublicObject {
    void Save();
}

Но при таком подходе вам придется определять метод сохранения для каждой сущности (например, ConcretePublicObjectOne в вашем примере)

...