web-dev-qa-db-de.com

Unity Container Resolve

Ich fange gerade mit Unity Container an und meine Registrierung sieht folgendermaßen aus:

static void UnityRegister()
{
      _container = new UnityContainer();
      _container.RegisterType<IBook, Book>();
      _container.RegisterType<IBookRepository, BookRepository>("Book");
      _container.RegisterType<IBookService, BookService>();
      _container.RegisterType<IBookRepository, DatabaseRepository>("Database");
}

Nun, wenn ich versuche, dies zu lösen: 

var service = _container.Resolve<IBookService>("Database");

Ich bekomme eine Fehlermeldung unten: 

Die Auflösung der Abhängigkeit ist fehlgeschlagen. Type = "UnityConsoleEx.IBookService", name = "Database". Ausnahme während: beim Auflösen. Ausnahme: InvalidOperationException - Der aktuelle Typ, UnityConsoleEx.IBookService, ist eine Schnittstelle und kann nicht erstellt werden. Vermissen Sie eine Typenzuordnung?

At the time of the exception, the container was:

Resolving UnityConsoleEx.IBookService,Database

Kann jemand zeigen, was ich falsch mache? 

6
Farukh

Das Hauptproblem ist, dass Sie keine benannte Instanz für Ihre BookService verwenden.

_container.RegisterType<IBookService, BookService>();

Sie versuchen jedoch, eine benannte Instanz zu lösen.

var service = _container.Resolve<IBookService>("Database");

Sie müssen ohne Namen auflösen, um diese Instanz zu erhalten.

var service = _container.Resolve<IBookService>();

Aus Ihrem Beispiel ist jedoch unklar, warum Sie benannte Instanzen überhaupt verwenden. Wenn Sie die Konstruktoren Ihrer Dienste bereitstellen, wird klarer, wie Sie Ihre Konfiguration durchführen können.

9
NightOwl888

Ich fand es heraus, ich brauchte eine benannte Instanz für den Service und den Injekt-Konstruktor.

static void UnityRegister()
{
    _container = new UnityContainer();
    _container.RegisterType<IBook, Book>();
    _container.RegisterType<IBookRepository, BookRepository>();            
    _container.RegisterType<IBookRepository, DatabaseRepository>();

    _container.RegisterType<IBookService, BookService>("BookService", new InjectionConstructor(typeof(BookRepository)));
    _container.RegisterType<IBookService, BookService>("DatabaseService", new InjectionConstructor(typeof(DatabaseRepository)));
}

Und löse es wie folgt:

var service = _container.Resolve<IBookService>("DatabaseService");
2
Farukh

Ich denke, Sie versuchen, BookService zu lösen, sollte DatabaseRepository als Parameter enthalten. Du kannst es nicht auf deine Art tun.

Sie können es so machen:

var service = _container.Resolve<IBookService>(new ParameterOverride("repository", _container.Resolve<IBookRepository>("Database")));

Vielleicht ist ein besserer Weg ein einmaliges Registrieren des Registers.

  _container = new UnityContainer();
  _container.RegisterType<IBook, Book>();
  if (useDatabase)
  {
      _container.RegisterType<IBookRepository, DatabaseRepository>();
  }
  else
  {
      _container.RegisterType<IBookRepository, BookRepository>();
  }
  _container.RegisterType<IBookService, BookService>();

Und jetzt lösen Sie den Dienst auf. Sie können Ihren Container auch so konfigurieren:

_container.RegisterType<IBookService, BookService>(
    new InjectionConstructor(                        // Explicitly specify a constructor
        new ResolvedParameter<IBookRepository>("Database") // Resolve parameter of type IBookRepository using name "Database"
    )
);

Dadurch wird der Container angewiesen, IBookService mit dem Konstruktor mit dem einzelnen IBookRepository-Parameter aufzulösen und IBookRepository mit dem Namen Database aufzulösen.

0
Backs