【问题标题】:How to avoid reflection?如何避免反射?
【发布时间】:2016-08-02 11:51:23
【问题描述】:

我有抽象类 BaseClassMyClassAMyClassB 实现。用户可以扩展这两个子类或使用它们,例如他只创建UserExtensionClassA 并按原样使用MyClassB。有一个类ClassC 负责类的初始化。它接收配置(例如,包含所需实现类的完整类名)并决定何时以及是否初始化这些类(例如,已经有 3 个现有的 BaseClass 实现实例 => 拒绝创建请求)。

问题:如何避免示例中的反射? ClassC 可以根据配置中的名称创建类。但我仍然可以更改库实现中的几乎所有内容,而且我不喜欢反射的东西。

【问题讨论】:

  • 这令人困惑,请发布一些代码以澄清情况。此外,反射似乎不是那么糟糕的解决方案......
  • 请发布您尝试过的内容?很有帮助。
  • 为什么不写代码而不是写“我有抽象类BaseClass 和MyClassA 和MyClassB 实现”?目前尚不清楚为什么以及如何使用反射(配置是字典?),你能展示一下吗?以及想要的伪代码。但总的来说,像 “我不喜欢反射的东西” 这样的理由并不合理。您阅读配置一次还是 1234567 次?您是否遇到性能/内存问题?

标签: c# oop c#-4.0 design-patterns


【解决方案1】:

我建议不要运行您自己的,而是依赖现有的 IoC(控制反转)容器,例如 Autofac,因为这为您提供了高度的灵活性,同时也促进了设计概念,例如依赖注入 (DI) 和反转控制(IoC)

大多数 IoC 容器都提供编程接口以及基于 JSON/XML 文件的配置支持,包括 Autofac

Autofac 配置文件示例:

{
    "defaultAssembly": "Autofac.Example.Calculator",
    "components": [
        {
            "type": "Autofac.Example.Calculator.Addition.Add, Autofac.Example.Calculator.Addition",
            "services": [
                {
                    "type": "Autofac.Example.Calculator.Api.IOperation"
                }
            ],
            "injectProperties": true
        },
        {
            "type": "Autofac.Example.Calculator.Division.Divide, Autofac.Example.Calculator.Division",
            "services": [
                {
                    "type": "Autofac.Example.Calculator.Api.IOperation"
                }
            ],
            "parameters": {
                "places": 4
            }
        }
    ]
}

构建容器:

// Add the configuration to the ConfigurationBuilder.
var config = new ConfigurationBuilder();
config.AddJsonFile("autofac.json");

// Register the ConfigurationModule with Autofac.
var module = new ConfigurationModule(config.Build());
var builder = new ContainerBuilder();
builder.RegisterModule(module);

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多