我想创建一个可用于依赖注入的工厂对象字典。
例如,假设我有一个名为ServiceLocator的静态类。应用程序可以使用:
ITest test = ServiceLocator<ITest>.GetInstance()
获取实现ITest接口的对象。
为了实现这一点,我首先创建了一个Interface IFactory
public interface IFactory<T>
{
T GetInstance<T>();
}
然后,例如,ITest的具体实现可能如下所示:
public class TestFactory : IFactory<ITest>
{
public ITest GetInstance<ITest>
{
return new (ITest)OneImplementationOfITest();
}
}
然后像这样定义ServiceLocator:
public static class ServiceLocator
{
private static Dictionary<string,object> m_Factories;
public static T GetInstance<T>
{
string type = typeof(T).ToString();
return ((IFactory<T>)Factories[type]).GetInstance();
}
}
不幸的是,IFactory中的T会产生编译错误:
“T必须是引用类型才能在通用类型的方法中用作参数T ......”
我可以想办法解决这个问题,例如定义IFactory而不是IFactory:
public interface IFactory
{
object GetInstance();
}
然后用户需要自己投射对象:
ITest test = (ITest)ServiceLocator<ITest>.GetInstance();
这是相当尴尬的,可能导致错误(例如,没有正确地投射)
如果有办法写的话会更好:
ITest test = ServiceLocator.GetInstance(“ITest”),但还没弄明白该怎么做。
答案 0 :(得分:5)
试试这个:
public interface IFactory<T>
where T: class
{
T GetInstance<T>();
}
这会将T
约束为引用类型。顺便说一句,这是许多可用的generic type constraints之一。