c# - 解决对象的最佳方法是什么?

标签 c# dependency-injection

我已经编写了一个解析器,因此我可以拥有一个非常原始的 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/

相关文章:

c# - 在linq中获取多个不同的分组值

c# - MigraDoc 表不继续到下一页

c# - 使用 ASP.NET Web API 将 yyyy-MM-dd 形式的日期查询参数反序列化为 noda time LocalDate 对象

dependency-injection - 尝试对 RoboGuice.newDefaultRoboModule() 进行单元测试和使用 Roboguice 2.0b3 和 Robolectric 失败

c# - 具体 .Net 类的依赖注入(inject)

c# - 在 MVC 中使用 DI 时的大量 Controller 构造函数参数列表

c# - nunit 测试中是否进行手动交互?

c# - 有没有办法从 FCKEditor 中删除所有不必要的 MS Word 格式

c# - 光注入(inject) : Constructor Injection and IDisposable

c# - MEF 4.5 中缺少 CompositionInitializer。我可以用什么代替?