Как я могу создать интерфейс для набора классов с почти идентичной функциональностью, но с разными параметрами и типами возвращаемых данных? - PullRequest
1 голос
/ 24 мая 2019

У меня есть серия классов, которые делают почти то же самое.Вот как выглядят 2 из предполагаемых дочерних классов:

class ItemWriter
{
    private List<Item> items;

    public ItemWriter(List<Item> items)
    {
        this.items= items;
    }

    public List<Item> Write()
    {
        using (var ctx = new DatabaseEntities())
        {
            using(var trx = ctx.Database.BeginTransaction())
            {
                ctx.Item.AddRange(items);
                rowsAdded = ctx.SaveChanges();
                trx.Commit();
            }
        }
        return items;
    }
}

И еще ...

class ItemShelfWriter
{
    private List<ItemShelf> itemShelfs;

    public ItemShelfWriter(List<ItemShelf> itemShelfs)
    {
        this.itemShelfs= itemShelfs;
    }

    public List<ItemShelf> Write()
    {
        using (var ctx = new DatabaseEntities())
        {
            using(var trx = ctx.Database.BeginTransaction())
            {
                ctx.TtemShelf.AddRange(itemShelfs);
                ctx.SaveChanges();
                trx.Commit();
            }
        }
        return itemShelfs;
    }
}

Вы можете видеть, что оба класса делают почти одно и то же - только они пишут вразные таблицы и методы Write() имеют разные типы возвращаемых значений.

Я хотел бы иметь интерфейс / абстрактный класс IWriter.cs, который заставляет каждый дочерний класс иметь метод Write (), возвращающий тип иконструктор, принимающий список.Если бы я мог удалить некоторое дублирование кода в Write (), это было бы хорошо.

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

1 Ответ

4 голосов
/ 24 мая 2019

Звучит как хороший случай для дженериков :

Интерфейс:

public interface IWriter<T>
{
    List<T> Write();
}

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

class Writer<T> : IWriter<T>
{
    private List<T> items;

    public Writer(List<T> items)
    {
        this.items= items;
    }

    public List<T> Write()
    {
        using (var ctx = new DatabaseEntities())
        {
            using(var trx = ctx.Database.BeginTransaction())
            {
                ctx.Item.AddRange(items);
                rowsAdded = ctx.SaveChanges(); // what is rowsAdded??
                trx.Commit();
            }
        }
        return items;
    }
}

Вы не объявили rowsAdded, поэтому я не знаю, что с этим делать.

Теперь вы можете создать экземпляр этого класса, например:

var itemWriter = new Writer<Item>(items);
var itemShelfWriter = new Writer<ItemShelf>(itemShelfs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...