相对较新的C#,寻找"最佳实践"做到以下几点的方式:
我有一个使用公共方法的类(传感器),例如" CommunicationStart"," DoThing1"," DoThing2"。
在调用这些方法之前,该类配置了传感器" Model"
基于该模型,公共方法应采用不同的代码路径。如果我要静态地执行此操作,则在每个公共方法中切换模型都可以解决问题。
我想动态地这样做,以帮助长期支持。什么是"适当的"在每个公共方法中包装动态加载的代码的方法?反射?代表们?动态加载的函数应该驻留在哪里?他们应该和他们的公共包装一样在同一个班级,还是住在一个新的班级?
我正在寻找更多"正确"方法,组织,而不是语法,因为我可以自己解决这个问题。非常感谢!
答案 0 :(得分:1)
我希望我能正确理解你的问题。 以下是为常见方法和传感器实现创建可扩展系统的方法:
用于处理公共代码(传感器公共方法需要):
如果动态加载程序集,可以使用Reflection查找实现公共接口的所有类,例如ISensorMethod
(在通用程序集中)。所有组件都必须知道它。
这个界面可以有一个方法,让我们说execute()
,以及一个能够识别方法的标识符,例如string Key { get; }
。
每个可重用的代码都是在一个单独的类中(每个方法一个类)。
您的主代码(加载程序集的代码)可以在内部保留List<ISensorMethod>
以引用所有加载的可重用方法。
对于&#34;传感器&#34;类:强>
你可以做同样的系统:动态加载程序集,找出所有&#34; Sensor
&#34;或&#34; ISensor
&#34;类。
公共继承的传感器方法可以通过其Key调用可重用的方法。
为此,您可以在每个Sensor
类中(在构造函数内或使用属性)中注入依赖项,让我们说IMethodCaller
,以允许它们通过键调用方法。
public interface IMethodCaller
{
void CallMethodByKey(string key);
}
然后可以使用:
public class ElectricSensor : Sensor
{
public ElectricSensor(IMethodCaller caller): base(caller)
{
}
public void CommunicationStart()
{
base.Caller.CallMethodByKey("START_COMMON");
base.Caller.CallMethodByKey("INITIALIZE_ELECTRIC");
}
// (...)
}
可以使用工厂设计模式完成正确传感器类的实例化... 根据您的需要,有很多种可能性。 我建议尽可能少地使用Reflection,因为如果发生错误,它总是处于一个非常棘手的代码中,并且问题的根源通常很远......除非所有异常和错误都使用有意义的错误消息进行非常谨慎的处理(明确开发人员在几秒钟内找到问题的真正来源)。
致以最诚挚的问候,