Unity Container Resolve

时间:2015-09-08 04:04:27

标签: c# dependency-injection unity-container

我刚开始使用Unity Container,我的注册如下:

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

现在,当我尝试解决这个问题时:

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

我收到以下错误:

  

依赖项的解析失败,输入=&#34; UnityConsoleEx.IBookService&#34;,name =&#34; Database&#34;。       在解决时发生异常:       例外情况是:InvalidOperationException - 当前类型UnityConsoleEx.IBookService是一个接口,无法构造。你错过了类型映射吗?

At the time of the exception, the container was:

Resolving UnityConsoleEx.IBookService,Database

有人能指出我做错了吗?

3 个答案:

答案 0 :(得分:9)

主要问题是您没有为BookService使用命名实例。

_container.RegisterType<IBookService, BookService>();

但您正尝试使用命名实例解决。

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

您需要在没有名称的情况下解析才能获得该实例。

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

但是从你的例子中不清楚为什么你首先使用命名实例。如果您发布服务的构造函数,将更清楚如何使您的配置工作。

答案 1 :(得分:2)

我想通了,我需要为服务创建命名实例并注入构造函数,如下:

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 :(得分:0)

我认为,您尝试使用应包含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"
    )
);

这将告诉容器使用带有IBookService参数的构造函数来解析IBookRepository,并解析名为IBookRepository的{​​{1}}。