2012-03-23 20 views
7

Posiadam bazę kodu, której chcę użyć zarówno dla interfejsu ASP.NET MVC, jak i dla interfejsu WPF/MVVM. Obiekty biznesowe są implementowane jako interfejsy, a logika biznesowa używa tych interfejsów do przekazywania danych.Implementowanie właściwości interfejsu w interfejsach?

Powiedz, że mam właściwość w moim interfejsie, która implementuje IEnumerable. Czy jest możliwe, aby różne wersje tego interfejsu używały różnych implementacji IEnumerable? Przykład tego, co próbuję wykonać:

class Reporting 
{ 
    public bool RunReport(IReportParams Params); 
} 

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    public List<Guid> SelectedItems { get; set; } 
    public List<StatusEnum> SelectedStatuses { get; set; } 
} 

class WpfReportParams : IReportParams 
{ 
    public ObservableCollection<Guid> SelectedItems { get; set; } 
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; } 
} 

Czy można to zrobić?

Edycja: Należy również zapytać „jak”, bo gdy próbuję to, że pojawiają się błędy podobne do tego:

„MvcReportParams” nie implementują „IReportParams.SelectedStatuses” członek interfejs. „MvcReportParams.SelectedStatuses” nie może realizować „IReportParams.SelectedStatuses”, ponieważ nie ma odpowiedniego rodzaju powrotny „System.Collections.Generic.IEnumerable”

ObservableCollection i Lista zarówno absolutnie wdrożenie IEnumerable, a więc to nie wydaje się sens dla mnie.

Last Edit

Cóż, ktoś pisał odpowiedź, ale usunął go z jakiegoś powodu, więc nie można oznaczyć go jako rozwiązanie. Oto, co skończyło się robi:

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    // Properties that the modelbinder dims and sets up 
    public List<Guid> SelectedItems { get; set; } 
    public List<StatusEnum> SelectedStatuses { get; set; } 

    // Explicityly implement my interface 
    IEnumerable<Guid> IReportParams.SelectedItems 
    { 
     get { return SelectedItems; } 
    } 

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses 
    { 
     get { return SelectedStatuses; } 
    } 
} 

class WpfReportParams : IReportParams 
{ 
    // Properties that my view dims and modifies 
    public ObservableCollection<Guid> SelectedItems { get; set; } 
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; } 

    // Explicityly implement my interface 
    IEnumerable<Guid> IReportParams.SelectedItems 
    { 
     get { return SelectedItems; } 
    } 

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses 
    { 
     get { return SelectedStatuses; } 
    } 
} 

To więcej linii kodu boilerplate pisać, ale lubię być bardziej wyraźne i tak.

+0

Absolutnie. Tak. –

+1

Również szybciej byłoby po prostu spróbować, niż napisać pytanie na ten temat. –

+0

@Boo Tylko co miałem zamiar powiedzieć Boo. Być może jest to raczej pytanie o zrozumienie, dlaczego działa (lub nie), a nie działa, jak kompilator powie ci wcześniej niż przepełnienie stosu, bez względu na to, jak szybko mu odpowiada :) – dreza

Odpowiedz

7

Prawdopodobnie wprowadziłbym to z właściwościami tylko do odczytu. Lepiej, aby klient dodawał/usuwał/aktualizował elementy w istniejącej kolekcji, zamiast całkowicie zastępować kolekcję.

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    public MvcReportParams() 
    { 
     SelectedItems = new Collection<Guid>(); 
     SelectedStatuses = new Collection<StatusEnum>(); 
    } 

    public IEnumerable<Guid> SelectedItems { get; private set; } 
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; } 
} 

class WpfReportParams : IReportParams 
{ 
    public WpfReportParams() 
    { 
     SelectedItems = new ObservableCollection<Guid>(); 
     SelectedStatuses = new ObservableCollection<StatusEnum>(); 
    } 

    public IEnumerable<Guid> SelectedItems { get; private set; } 
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; } 
} 
Powiązane problemy