【问题标题】:Unity Container Resolve统一容器解决
【发布时间】:2015-09-08 04:04:27
【问题描述】:

我刚开始使用 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");

我收到以下错误:

依赖项解析失败,type = "UnityConsoleEx.IBookService",name = "Database"。 异常发生时:解决时。 异常是: InvalidOperationException - 当前类型 UnityConsoleEx.IBookService 是一个接口,无法构造。您是否缺少类型映射?

At the time of the exception, the container was:

Resolving UnityConsoleEx.IBookService,Database

谁能指出我做错了什么?

【问题讨论】:

    标签: c# dependency-injection unity-container


    【解决方案1】:

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

    _container.RegisterType<IBookService, BookService>();
    

    但您正在尝试使用命名实例进行解析。

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

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

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

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

    【讨论】:

      【解决方案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");
      

      【讨论】:

        【解决方案3】:

        我认为,您尝试使用应包含 DatabaseRepository 作为参数来解析 BookService。你不能以你的方式去做。

        你可以这样做:

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

        这将告诉容器使用带有单个 IBookRepository 参数的构造函数解析 IBookService,并使用名称为 Database 解析 IBookRepository

        【讨论】:

          猜你喜欢
          • 2018-08-06
          • 1970-01-01
          • 2022-06-10
          • 1970-01-01
          • 2014-02-19
          • 2021-05-26
          • 1970-01-01
          • 1970-01-01
          • 2020-12-16
          相关资源
          最近更新 更多