我有一个使用Unity的场景,这有点令人困惑......假设我有一个AuthenticationService来验证用户,并且成功使用TextLogger类或DbLogger类成功登录到文本文件或数据库。通常,我将在我的项目中使用的类我将在我的模块类中正确注册,如下所示:
public class LoggingModule
{
IUnityContainer _iocContainer;
public LoggingModule(IUnityContainer container)
{
_iocContainer = container;
}
public void Init()
{
//Add any logic here to look in a config file, check a property
//or any other condition to decide which implementation is registered.
//register the database logger to the ILogger interface
_iocContainer.RegisterType(typeof(ILogger), typeof(DBLogger));
}
}
这将被注入我的身份验证服务的构造函数中。但是,如果我想在我的应用程序中的不同点使用两个记录器,首先在Init方法中注册两种类型,即TextLogger和DBLogger? 其次,我的容器如何知道要解决哪种类型?
请帮忙......
答案 0 :(得分:3)
将这两种类型注册到名称为容器的容器中,即<; p>
container.RegisterType<ILogger, DBLogger>("DBLogger");
container.RegisterType<ILogger, TextLogger>("TextLogger");
并使用name参数解析您的类型,即。;
var logger = container.Resolve<ILogger>("DBLogger");
答案 1 :(得分:0)
除非您使用嵌套容器并自己调用Resolve
,否则Unity将提供应用程序范围的解决方案,而非场景驱动的解决方案。
您可以使用嵌套的Unity容器实现您想要的功能,但您可能最好在自己的代码中执行解决方案,尤其是嵌套容器方法更适用于应用“规则的例外” - 广泛的分辨率。
您需要一段代码来确定哪种具体类型适合每个实例。然后可以将此代码推送到更高级别的控制/编排类中,该类将相应的具体类型注入到从属实例中。