У меня есть кодовая база, которую я хочу использовать как для ASP.NET MVC, так и для внешнего интерфейса WPF / MVVM. Бизнес-объекты реализованы как интерфейсы, и бизнес-логика использует эти интерфейсы для передачи данных.
Скажем, у меня есть свойство в моем интерфейсе, которое реализует IEnumerable. Возможно ли, чтобы разные версии этого интерфейса использовали разные реализации IEnumerable? Пример того, что я пытаюсь выполнить:
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; }
}
Можно ли это сделать?
Редактировать: я должен был также спросить "как", потому что, когда я пытаюсь это сделать, я получаю ошибки, подобные этой:
«MvcReportParams» не реализует элемент интерфейса «IReportParams.SelectedStatuses». «MvcReportParams.SelectedStatuses» не может реализовать «IReportParams.SelectedStatuses», потому что у него нет соответствующего возвращаемого типа «System.Collections.Generic.IEnumerable»
ObservableCollection и List оба полностью реализуют IEnumerable, и поэтому мне кажется, что это не имеет смысла.
Последнее редактирование
Ну, кто-то опубликовал ответ, но почему-то удалил его, поэтому я не могу пометить его как решение. Вот что я в итоге сделал:
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; }
}
}
Это больше строк кода для написания, но мне все равно нравится быть более явным.