2016-08-11 6 views
2

Я пытаюсь увеличить мое повторное использование кода здесь. У меня есть SearchQueryDto с полями, как ниже:Свойства совместного использования среди нескольких классов C#

public class SearchQueryDto{ 
    // some other properties 
    public string SearchUsername { get; set; }   // repetition 1 
    public string SearchProfile { get; set; }   // repetition 1 
    public SearchInterest SearchInterest { get; set; } // repetition 1 
    // some other properties 
} 

Тогда, у меня есть модель базы данных для Broadcast со следующим:

public class Broadcast { 
    // some other different properties 
    public string SearchUsername { get; set; }   // repetition 1  
    public string SearchProfile { get; set; }   // repetition 1 
    public SearchInterest SearchInterest { get; set; } // repetition 1 
    // some other different properties 
    public Status Status {get; set;}     // repetition 2 
    public DateTime DateStarted {get; set;}    // repetition 2 
} 

Тогда у меня есть модель базы данных для BroadcastMessage со следующим:

public class BroadcastMessage { 
    // some other properties 
    public Status Status {get; set;}     // repetition 2 
    public DateTime DateStarted {get; set;}    // repetition 2 
} 

Как можно заметить, добавляя новые критерии поиска означает, что я должен пойти и добавить поля как моя модель базы данных Broadcast И DTO. Как я могу делиться свойствами между двумя классами? Наследование, похоже, не является ответом, потому что я могу поменять свойства между Broadcast и некоторым другим типом.

Я ищу что-то простое, как:

// handles repetition 1 
public class SearchCriteria{ 
    public string SearchUsername { get; set; } 
    public string SearchProfile { get; set; } 
    public SearchInterest SearchInterest { get; set; } 
} 
// handles repetition 2 
public class StatusProperties{ 
    public Status Status {get; set;} 
    public DateTime DateStarted {get; set;} 
} 

public class SearchQueryDto: SearchCriteria{    
    // some other properties 
} 
public class Broadcast : SearchCriteria, StatusProperties{ // multiple inheritance :(
    // some other different properties 
} 
public class BroadcastMessage : StatusProperties{ 
    // some other properties 
} 

Я не думаю, что наследство будет работать из-за Broadcast потребности, и я не думаю, что интерфейсы будут работать, потому что тогда я взял шаг в неправильном направлении - обновление n+1 вещей, а не просто n вещи для удобства компилятора, обеспечивающие наследование (а не удобство, которое я ищу).

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

+0

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

+0

@SuperPeanut - Мне это нравится ...но как мне перейти к биту ссылки, не вставляя эти объекты за другое свойство? – RobVious

+0

Как насчет создания нового (может быть, абстрактного) типа над 2, заставляющего 2 наследовать этот новый тип. Кроме того, почему бы просто не использовать 1 тип, видя, что 2 имеют те же свойства. Если вам когда-либо приходилось добавлять новые свойства, которые не нужны одному из 2-х применений, вам просто нужно наследовать новый тип из этого. –

ответ

0

Создайте объект, в котором оба класса имеют экземпляры. Обновление для SearchCriteria обновляет свойства в обоих этих классах. Ваши два класса (трансляция и профайлы) остаются развязанными.

SearchCriteria{ 
    public string SearchUsername { get; set; } 
    public string SearchProfile { get; set; } 
    public SearchInterest SearchInterest { get; set; } 
} 

public class ProfileSearchDto { 
    public SearchCriteria searchCriteria {get; set;} 
} 

public class Broadcast { 
    public SearchCriteria searchCriteria {get; set;} 
} 
+0

Я собирался опубликовать только это. Это единственный способ увидеть это без наследования. –

+0

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

+0

Затем используйте интерфейс – wizardzz

2

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

Но я думаю, что было бы без проблем использовать интерфейс, чтобы избежать забытого свойства.

public interface IBroadcastMessage{ 
    public Status Status {get; set;} 
    public DateTime DateStarted {get; set;} 
} 

public class Broadcast : IBroadcastMessage, ISearchQueryDto { /* ... */ } 
public class BroadcastMessage : IBroadcastMessage { /* ... */ } 

Это не поможет избежать аналогичного кода, совершенно наоборот, вы должны еще раз написать все свои свойства. Но если вы реализуете его в интерфейсе, вы не можете забыть его реализовать во всех классах.
Интерфейсы, подобные этим, могут быть полезны и в других местах. например для передачи IBroadcastMessage и не волнует, какой именно он есть.


В этом случае, как насчет рефакторинга? Зачем добавлять свойство для каждого нового критерия, если вы можете создать базовый класс, который может фильтровать элементы в зависимости от унаследованных реализаций и добавлять их в список? Просто идея.

+0

Как было сказано в моем вопросе, ни наследование, ни интерфейсы не решают мою конкретную проблему. Я полностью понимаю преимущества, которые они предоставляют, но это не те преимущества, которые я ищу. – RobVious

+0

@ RobVious Я написал этот ответ прежде всего из-за третьей строки моего первого абзаца. – Koopakiller