我已经编写了一个解析器,因此我可以拥有一个非常原始的 DI 框架。在框架中,如果没有指定或注册任何内容,我允许依赖项解析器指定要加载的默认类型。
但是,我执行默认加载的方式让我感到疑惑。我不确定我是否以最好的方式完成了这件事。
例子:
T LoadDefaultForType<T>()
{
T _result = default(T);
if (typeof(T) == typeof(ISomeThing)
{
result = new SomeThing();
}
... more of the same
else
{
throw new NotSupportException("Give me something I can work with!");
}
return _result;
}
更新
如果模块或程序集未使用具体类型配置接口(interface),则此方法的用途是获取给定接口(interface)的默认对象。
例如:
IoC.Resolve<ISomeThing>();
如果没有向 ISomeThing 注册任何其他对象,则需要返回给我一个 SomeThing 对象。在这种情况下,LoadDefaultForType 是使用默认值的最后努力(在这种情况下,无论我的域模型是什么)。
Resolve 也可能对此有所启发:
T Resolve<T>()
{
T _result = default(T);
if (ContainedObjects.ContainsKey(typeof(T))
_result = (T)ContainedObjects[typeof(T)];
else
_result = LoadDefaultForType<T>();
return _result;
}
有什么想法吗?鉴于我正在尝试允许约定优于配置方法,是否有更好的方法来加载默认类型?
最佳答案
一些建议:
您可以创建一个属性,用于标记特定接口(interface)的默认实现类型。当您尝试解析类型时,您可以在 T 上搜索此属性并使用反射来动态实例化该类型。
或者,您可以使用反射来搜索可用的(加载的)程序集或实现接口(interface)的具体类型。这可能是一个缓慢且昂贵的过程,因此只有在默认情况很少见的情况下才有意义。
最后,如果您熟悉命名约定,您可以搜索与接口(interface)同名但没有前导“I”的类。这不是最好的方法,但肯定是一种可以在紧要关头发挥作用的方法。
关于c# - 解决对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1094253/