Как я могу реорганизовать эти 2 метода в 1? - PullRequest
2 голосов
/ 28 марта 2009

Я пытаюсь провести рефакторинг некоторого кода Entity Framework, в котором у меня есть сущность Products и связанные сущности для серии, семейства, бренда и т. Д. Все сущности серии, семейства и бренда имеют одинаковую базовую структуру с Id и Текстовое свойство.

Два метода, приведенные ниже, очень похожи и должны иметь возможность рефакторинга для одного метода, но я не уверен, как динамически передавать, в каком объекте я запрашиваю. В этом случае мне нужно иметь возможность перейти в db.ProductFamilies или db.ProductSeriesSet. Любые идеи, как сделать эти 2 стать 1?

Спасибо!

    public DTOs.ProductCollection GetFamily(int id)
    {
        using (Entities db = new Entities())
        {
            var fam = (from collection in db.ProductFamilies.Include("Product")
                        .Include("Product.Stuff1")
                        .Include("Product.Stuff2")
                       where collection.Id == id
                       select collection).FirstOrDefault();
            return ProductCollectionEFToProductCollectionDTO(fam, true);
        }
    }

    public DTOs.ProductCollection GetSeries(int id)
    {
        using (Entities db = new Entities())
        {
            var ser = (from collection in db.ProductSeriesSet.Include("Product")
                        .Include("Product.Stuff1")
                        .Include("Product.Stuff2")
                       where collection.Id == id
                       select collection).FirstOrDefault();
            return ProductCollectionEFToProductCollectionDTO(ser, true);
        }
    }

Ответы [ 2 ]

5 голосов
/ 28 марта 2009

Вы можете использовать Func<T, TResult>, чтобы делегировать выборку коллекции хорошего объекта вызывающей стороне:

public DTOs.ProductCollection Get(int id, Func<Entities, XXX> selector)
{
    using (Entities db = new Entities())
    {
        var result = (from collection in selector(db).Include("Product")
                    .Include("Product.Stuff1")
                    .Include("Product.Stuff2")
                   where collection.Id == id
                   select collection).FirstOrDefault();
        return ProductCollectionEFToProductCollectionDTO(result, true);
    }
}

Здесь XXX имеет тип db.ProductFamilies и db.ProductSeriesSet.

Затем вы можете назвать это так:

Get(42, db => db.ProductFamilies);
Get(12, db => db.ProductSeriesSet);

Это работает?

2 голосов
/ 28 марта 2009

Если db.ProductFamilies и db.ProductSeriesSet наследуются от одного базового класса, то при использовании ProductCollectionEFToProductCollectionDTO ( BaseClass obj, значение bool);

Или подумайте о Общий тип .

Это два основных подхода.

...