Wenn Sie nach einer Lösung suchen, die für die meisten Anwendungen geeignet ist, können Sie die Komponente auf höchster Ebene registrieren und dann beheben. Solange Sie die Instanz auflösen, löst Unity die Abhängigkeiten auf (z. B. IUnityContainer).
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Registering dependencies ...");
var container = new UnityContainer();
container.RegisterType<ProgramStarter, ProgramStarter>();
// Do other registrations.
var program = container.Resolve<ProgramStarter>();
// Since ProgramStarter was resolved using Unity it will also resolve the container.
program.Run();
}
}
public class ProgramStarter
{
public ProgramStarter(IUnityContainer container)
{
// Do something with container.
}
public Run()
{
// Do stuff.
}
}
Oder ein Beispiel für WPF:
IUnityContainer container = new UnityContainer();
// Do registrations.
var window = container.Resolve<MainWindow>();
window.Show();
MainWindow
wird nun in der Lage sein, sowohl die Behälter und andere Abhängigkeiten zu lösen.
Auch haben einen Blick auf diese Frage: Where to place and configure IoC container in a WPF application?
Als Nebenbemerkung ich meinen Container in der Regel als eine statische Instanz halten, und viele andere Implementierungen die gleiche Sache gesehen. Ich finde es bequem, es zu benutzen, wenn Sie sich in einer Situation befinden, in der es nicht möglich ist, es zu lösen.
public static class IocContainer
{
private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
// Possibly do registrations here as well...
return container;
});
public static IUnityContainer Instance
{
get { return Container.Value; }
}
}
Was genau meinen Sie mit "Nicht-MVC"? Es gibt viele Möglichkeiten, wie UWP, WPF, Console App und mehr – Domysee
Ich suche eine Lösung, die für alle Arten von .Net-Anwendungen gilt. –
Es gibt keine Lösung, die mit allen Arten von .Net-Anwendungen funktioniert. Es gibt Lösungen für jeden, aber sie sind alle unterschiedlich. – Domysee