RefactoringStaticClassestoUseDependencyInjection我们需要在具有静态方法的代码中使用非托管库。我想在我的代码中引入库操作作为依赖项。除了静态方法之外,库还有初始化器和设置方法,它们都是全局的。因此,我不能将它包装在一个实例类中,因为如果一个实例更改设置,所有其他实例都会受到影响,如果一个实例初始化,所有其他实例将重新初始化。我想把它作为一个单独的类来介绍。这样它将在一个实例类中,但只有一个实例,所以我不必担心更改设置或初始化。您如何看待这种方法?我对依赖注入模式很陌生,我不确定单例模式是否是一个好的解决方案?您对类似案例的解决方案是什么?编辑:初始化也是一个参数,所以我不能只锁定方法调用并重新初始化并更改每次调用的设置。编辑2:以下是一些方法的签名:publicstaticvoidInitialize(intsomeParameter)//参数只能通过重新初始化来更改,这//会将所有设置重置为默认值。publicstaticfloat[]Method1(intsomeNumber,float[]someArray)publicstaticvoidChangeSetting(stringsettingName,intsettingValue)如果你只需要在启动时设置一次,那么我建议创建一个非静态包装类它静态地在自己的静态构造函数中对类进行所有初始化。这样你就可以放心,它只会发生一次:UnManagedStaticClass.Settings=...;}publicvoidMethod1(){UnManagedStaticClass.Method1();但是,如果您需要在每次调用它时更改设置,并希望使实例线程安全,那么我建议锁定静态对象,这样您就不会不小心覆盖静态设置。仍然被另一个线程使用:}静态对象lockRoot=newObject();publicvoidMethod1(){lock(lockRoot){UnManagedStaticClass.Settings=...;UnManagedStaticClass.Method1();如果需要将初始化参数传递到类的实例构造函数中,也可以通过使用静态标志字段来实现此操作:publicclassMyWrapper{publicMyWrapper(InitParametersp){lock(lockRoot){if(!initialized){UnManagedStaticClass.Initialize(p);初始化=真;}}}staticboolinitialized=false;静态对象lockRoot=newObject();publicvoidMethod1(){lock(lockRoot){UnManagedStaticClass.Settings=...;UnManagedStaticClass.Method1();如果你仍然需要每次都重新初始化,但你担心性能,因为重新初始化太慢,那么唯一的其他选择(除了可怕的单例)是自动检测是否需要重新初始化,只有在必要的。至少那时,唯一的时间是两个线程同时使用两个不同的实例。你可以这样做:publicclassMyWrapper{publicMyWrapper(InitParametersinitParameters,Settingssettings){this.settings=设置;私人初始化参数初始化参数;私人设置设置;();privatevoidInitializeIfNecessary(){if(currentOwnerInstance!=this){currentOwnerInstance=this;非托管静态类。初始化(初始化参数);非托管静态类。设置=设置;}}publicvoidMethod1(){lock(lockRoot){初始化;UnManagedStaticClass.Method1();我将使用无状态服务类,并在每次方法调用时传递静态类的状态信息。在不知道您的任何详细信息的情况下,我将展示另一个带有c#静态类的示例。publicstaticclassLegacyCode{publicstaticvoidInitialize(intp1,stringp2){//一些静态}publicstaticvoidChangeSettings(boolp3,doublep4){//一些静态}publicstaticvoidDoSomething(stringsomeOtherParam){//基于一些静态状态执行}}publicclassLegacyCodeFacadeService{publicvoidPerformLegacyCodeActivity(LegacyCodeStatestate,LegacyCodeParamslegacyParams){lock(_lockObject){LegacyCode.Initialize(state.P1,state.P2);LegacyCode.ChangeSettings(state.P3,state.P4);LegacyCode.DoSomething(legacyParams.SomeOtherParam);//dosomethingtoresetstate,perhaps}}}你需要填写一些空白,但希望你明白了。重点是在所需的最短时间内在静态对象上设置状态,并在整个时间段内锁定访问,因此其他调用者不会受到全局状态更改的影响。您必须创建此类的新实例才能使用它,因此它是完全可注入和可测试的(除了提取接口的步骤,为简洁起见我跳过了该步骤)。这里有很多实现。例如,如果您必须经常更改LegacyCodeState,但仅更改为几个特定状态,则您可能有重载来完成管理这些状态的工作。编辑这在很多方面都优于单例,最重要的是你将无法积累和耦合到全局状态:如果它是静态类的唯一入口点,它会将全局状态转换为非全局状态状态。但是,如果您最终需要单例,则可以通过在此处包装构造函数来轻松切换。以上就是《C#学习教程:重构静态类使用依赖注入》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——如果需要,稍后更改生活方式管理策略returnnewLegacyCodeFacadeService();}publicvoidPerformLegacyCodeActivity(LegacyCodeStatestate,LegacyParamslegacyParams.LegacyParams.Code){lock(_Object),state.P2);LegacyCode.ChangeSettings(state.P3,state.P4);LegacyCode.DoSomething(legacyParams.SomeOtherParam);//dosomethingtoresetstate,或许}}}本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
