Hej, mam problem, z którym się bawię jak dziecko. Już drugi dzień zastanawiam się jak rozwiązać dość prostą kwestię.
Mam jakiś model. Dajmy na to, że jest Dokument, który składa się z różnych elementów.
Każdy element dokumentu jest tworzony za pomocą Buildera.
Do tej pory miałem tak, że Builder był osobnym serwisem, do którego wstrzykiwałem zależność odpowiadającą za tłumaczenia tekstów:
public class ModelBuilder
{
ILocalizer localizer;
public ModelBuilder(ILocalizer loc)
{
localizer = loc;
}
public SomeItem CreateSomeItem()
{
SomeItem item = new SomeItem();
item.Name = localizer.Localize["Blabla"];
//dalsze tworzenie elementu
}
}
Ale w pewnym momencie okazało się, że w pewnych warunkach zamiast jednego SomeItem powinienem utworzyć jeszcze inny obiekt i je ze sobą powiązać. I tu zaczął się problem. Rozwiązania miałem dwa:
- Umieścić tą logikę biznesową w serwisie (odpowiedzialnym za komunikację z bazą danych), np:
public class SomeItemService
{
IOtherItemService otherService;
public void AddSomeItem(SomeItem item)
{
if(jakis_warunek)
{
OtherItem oi = CreateOtherItem(); //odwołanie do buildera
otherService.Add(oi);
item.Parent = oi;
}
db.Save(item);
}
Ale trochę mi to nie do końca pasuje. Głównie z tego powodu, że ciężko będzie to pożenić z UI.
Z drugiej strony przyszło umieszczenie tej logiki w modelu. I tu niby wszystko by się zgodziło, ale problemem dla mnie stała się zależność od ILocalizer. Zapaliła mi się taka lampka, że chyba nie powinienem tego robić. A pomysł jest taki, że całego buildera przenoszę do modelu, np:
public class Document
{
public static ILocalizer Localizer {get; set;}
public SomeItem CreateSomeItem()
{
SomeItem item = new SomeItem();
item.Name = Localizer["Blabla"];
if(jakis_warunek)
{
OtherItem oi = new OtherItem();
item.Parent = oi;
}
Items.Add(someItem);
}
}
Tu wszystko mi wygląda ok, poza tym Localizerem. Bardzo on mnie tu dźga w bok i nie wiem za bardzo, co z tym zrobić. Localizer będzie oczywiście rejestrowany jako singleton. Document nie, bo w aplikacji może być kilka różnych dokumentów.
Co Wy o tym myślicie? A może jest jakieś inne rozwiązanie?