Sto lavorando su un'applicazione. Sto usando una miscela di TDD e DDD. Sto lavorando sodo per separare i livelli della mia applicazione ed è qui che arriva la mia domanda.
La mia soluzione è strutturata come segue
Solution
MyApp.Domain (WinRT class library)
Entity (Folder)
Interfaces(Folder)
IPost.cs (Interface)
BlogPosts.cs(Implementation of IPost)
Service (Folder)
Interfaces(Folder)
IDataService.cs (Interface)
BlogDataService.cs (Implementation of IDataService)
MyApp.Presentation(Windows 8 XAML + C# application)
ViewModels(Folder)
BlogViewModel.cs
App.xaml
MainPage.xaml (Contains a property of BlogViewModel
MyApp.Tests (WinRT Unit testing project used for my TDD)
Quindi ho intenzione di utilizzare il mio ViewModel con l'interfaccia utente XAML
Sto scrivendo un test e definisco le mie interfacce nel mio sistema e ho il seguente codice fino ad ora.
[TestMethod]
public void Get_Zero_Blog_Posts_From_Presentation_Layer_Returns_Empty_Collection()
{
IBlogViewModel viewModel = _container.Resolve<IBlogViewModel>();
viewModel.LoadBlogPosts(0);
Assert.AreEqual(0, viewModel.BlogPosts.Count, "There should be 0 blog posts.");
}
viewModel.BlogPosts
è un ObservableCollection<IPost>
Ora .. il mio primo pensiero è che mi piacerebbe che il metodo LoadBlogPosts sul ViewModel richiamasse un metodo statico sull'entità BlogPost.
Il mio problema è che ho bisogno di iniettare IDataService nell'oggetto Entity in modo che promuova l'accoppiamento lento. Ecco le due opzioni con cui sto combattendo:
-
Non utilizzare un metodo statico e utilizzare un metodo membro sull'entità BlogPost. Chiedi a BlogPost di prendere un
IDataService
nel costruttore e utilizzare dependency injection per risolvere l'istanza di BlogPost e l'implementazione diIDataService
. -
Non utilizzare l'entità per chiamare
IDataService
. Metti ilIDataService
nel costruttore del ViewModel e usa il mio contenitore per risolvere ilIDataService
quando il modello di vista è istanziato.
Quindi con l'opzione uno i livelli appariranno come questo
ViewModel(Presentation layer) -> Entity (Domain layer) -> IDataService (Service Layer)
o
ViewModel(Presentation layer) -> IDataService (Service Layer)