【发布时间】:2014-07-29 23:30:46
【问题描述】:
我正在使用 Unity 进行依赖注入,我想在运行时控制,解析哪个特定类型并将其作为依赖项传递给构造函数。
我有一个界面:
public interface IDatabase
{
void DoSomething();
}
这是由两个类实现的:
public class SQLDatabase : IDatabase
{
public void DoSomething()
{
//Do Something on a SQL server database...
}
}
public class OracleDatabase : IDatabase
{
public void DoSomething()
{
//Do Something on an Oracle database...
}
}
第三个类依赖于 IDatabase
public class DataService: IDataService
{
public DataService(IDatabase database)
{
database.DoSomething();
}
}
模块向 Unity 注册每个类,并且为两个 IDatabase 类型指定特定名称,以便区分它们:
container.RegisterType<IDatabase, SQLDatabase>("SQLDatabase");
container.RegisterType<IDatabase, OracleDatabase>("OracleDatabase");
container.RegisterType<IDataService, DataService>();
我需要创建一个 Consumer 的实例,此时我想指定实现 IDatabase 的两种类型中的哪一种由 Unity 使用/注入,但我不知道如何告诉 Unity 哪种具体类型构建/解决?我想我想要这样的东西(伪代码):
public class Consumer
{
IDataService dataService = null;
public Consumer(string runtimeChoice)
{
if (runtimeChoice == "SQLSERVER")
{
dataService = _container.Resolve<IDataService>("SQLDatabase");
}
else if (runtimeChoice == "Oracle")
{
dataService = _container.Resolve<IDataService>("OracleDatabase");
}
}
}
那么,我如何告诉 Unity 解析 IDatabase 类型,使用特定的命名类型,并将其传递给依赖对象的构造函数,但在运行时执行?
【问题讨论】:
-
使其成为可能返回已配置容器的方法的参数。
-
您真的想在应用程序运行时切换数据库还是
runtimeChoice是在启动后固定的值(即放置在应用程序的配置文件中)? -
不,它不会在运行时更改,但需要在运行时选择。用户有多个可用源,因此代码需要在运行时处理选择。
标签: c# unity-container