Цепочка DependencyA.DependencyB.DependencyC
обычно считается нарушением Закона Деметры (вы фактически полагаетесь на зависимость от зависимости и т. Д.).
Недавно я решил похожую проблему проектирования,используя Mediator , определяемый интерфейсом, таким как IMyOperationNameContext
, который позволял мне совместно использовать / внедрять объединенный контекст двух моделей ViewModel с элементом управления WinForms, который использует третью модель ViewModel, и все это без соединениямоделируются напрямую.
Примерно так (обратите внимание, что в примере IAlbumContext
действует больше как прокси, но это только потому, что образец упрощен):
interface IAlbumContext
{
public AlbumInfo SelectedAlbum { get; set; }
}
class AlbumContext
{
AlbumSelectionViewModel _model;
public AlbumContext(AlbumSelectionViewModel model)
{
_model = model;
}
public Album SelectedAlbum {
get { return _model.Album; }
}
}
class PhotoUploadDialog : Dialog
{
public PhotoUploadDialog(IAlbumContext context, PhotoUploadViewModel viewModel)
{
}
}
Хотя этоРешение сработало для меня, и мне нравится, что оно с высокой степенью сплоченности и развязано, в конечном итоге оно не масштабируемо (например, количество таких контекстных интерфейсов может быстро расти в зависимости от приложения).Однако с более общим решением компромисс заключается в том, что код становится сложнее следовать.