我刚开始使用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
有人能指出我做错了吗?
答案 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}}。