Wie sich zu registrieren eine Klasse, die `Func "< "> " als parameter?
Ich habe den folgenden code:
_container = new UnityContainer();
_container.RegisterType<IDownloader, Downloader>();
_container.RegisterType<INewObject, NewObject>();
_container.RegisterType<SearchViewModel>();
SearchViewModel
Klasse mit Konstruktor-injection:
class SearchViewModel
{
private readonly Func<IDownloader> _downloaderFactory;
private readonly INewObject _newObject;
private IDownloader _downloader;
public SearchViewModel(Func<IDownloader> downloaderFactory, INewObject newObject)
{
_downloaderFactory = downloaderFactory;
_newObject = newObject;
}
}
Die Frage:, Wie sich zu registrieren SearchViewModel
hat Fun<>
als parameter?
_container.RegisterType<SearchViewModel>(new InjectionConstructor(DownloaderFactory()));
Der obige code funktioniert nur ohne INewObject
.
Das Ziel: Beheben Fabrik mit InjectionConstructor
und beheben INewObject, INewObject2, INewObject3
automatisch (ohne Parameter: RegisterType<SearchViewModel>()
).
Ist es möglich? Vielleicht wechselt?
- Warum nutzen Sie nicht die Setter-Injektion für INewObject Parameter?
- Warum machen Sie SearchViewModel hängt Func<IDownloader>? Ist es nicht das leaky abstraction? Ich denke, Sie sollten direkt mit der Spritze IDownloader-Schnittstelle. Eine konkrete Umsetzung der IDownloader können Kapseln das Werk Verhalten. Siehe code-Beispiel hier: stackoverflow.com/questions/9757953/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich das problem gelöst:
neue Func ist ein Schlüssel, denn bevor ich versucht:
Auch der bessere Weg, um die Verwendung
IDownloaderFactory
stattFunc<IDownloader> downloaderFactory
.IDownloaderFactory
können Kapseln die Delegierten.Ich denke auch, dass mit ein Delegierter, der Abhängigkeit innerhalb der Fabrik ist die bessere Lösung als gebrochene Zusammensetzung Root.
Den allgemein anerkannten Muster zu verwenden ist hier zu erklären, eine abstrakte Fabrik und machen es etwas deutlicher:
Dann erstellen Sie eine Klasse, die zum darstellen der Fabrik, verwendet einfach den container wieder zu beheben Instanzen:
Mit diesem Ansatz ist noch deutlicher und spielt mehr schön mit den Containern, auch er hält noch den Behälter Weg von Ihrem Anwendungs-und Geschäftslogik, jetzt müssen Sie nur eine kleine Anpassung Ihrer SearchViewModel Klasse:
}
Jetzt können Sie sehen, es funktioniert einfach und erstellt neue Instanzen jeder Zeit.
Einrichten der container würde dann so Aussehen:
Beachten Sie, dass Sie benötigen, um registrieren Sie die Instanz des Containers, mit der Sie arbeiten, so dass die Fabrik bekommt die gleiche Instanz entweder mit dieser Methode oder ein ThreadLocal-instancing oder so etwas.
Hinweis:
auch nur vorsichtig sein, die Tatsache, dass die Verwendung der Func-Ansatz oder den Behälter zu lösen, die downloader können unerwünschte Effekte in Ihrem client. Zum Beispiel, wenn der Behälter ist standardmäßig so eingerichtet werden transiente Objekte Downloader dann eine neue Instanz erstellt jedes mal. Veränderung der Lebensdauer des Containers, möglicherweise den client zum abrufen der gleichen Instanz jeder Zeit. In einem solchen Fall ist es besser manuell zu konstruieren, die downloader-Objekt im Werk und die Nutzung der container nur für die Argumente, die von downloader.