Single Container Solutions

I'm just starting out with Unity Container, and my registration looks like this:

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

Now when I try to resolve this:

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

I get the error below:

Dependency resolution failed, type = "UnityConsoleEx.IBookService", name = "Database". An exception occurred at the time: at resolution. Exception: InvalidOperationException. The current type, UnityConsoleEx.IBookService, is an interface and cannot be constructed. Do you miss type mapping?

At the time of the exception, the container was:

Resolving UnityConsoleEx.IBookService,Database

Can someone point out what I'm doing wrong?

+4
source share
3 answers

, BookService.

_container.RegisterType<IBookService, BookService>();

.

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

, .

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

, . , , .

+7

, , :

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)));
}

, :

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

, BookService DatabaseRepository . .

:

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

, - , :

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

, . , :

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

This will allow the container to resolve IBookServiceusing the constructor with a single parameter IBookRepositoryand resolve IBookRepositorywith the name Database.

0
source

Source: https://habr.com/ru/post/1606343/


All Articles