如何避免c#项目中的代码重复

如何避免c#项目中的代码重复,c#,design-patterns,refactoring,C#,Design Patterns,Refactoring,我有一个使用specflow自定义插件的情况。使用specflow自定义插件,我有两个不同的项目,比如项目A和项目B。这两个项目都有自己的存储库 项目A有以下类别(请查找代码段): 公共类CustomTestGeneratorProvider:IUnitTestGeneratorProvider { 公共CustomTestGeneratorProvider(CodeDomHelper CodeDomHelper) { _unitTestGeneratorProvider=新建 NUnit3Te

我有一个使用specflow自定义插件的情况。使用specflow自定义插件,我有两个不同的项目,比如项目A和项目B。这两个项目都有自己的存储库

项目A有以下类别(请查找代码段):

公共类CustomTestGeneratorProvider:IUnitTestGeneratorProvider
{
公共CustomTestGeneratorProvider(CodeDomHelper CodeDomHelper)
{
_unitTestGeneratorProvider=新建
NUnit3TestGeneratorProvider(codeDomHelper);
CodeDomHelper=CodeDomHelper;
}
public UnitTestGeneratorTraits GetTraits()
{
return _unitTestGeneratorProvider.GetTraits();
}
public void SetTestClass(TestClassGenerationContext generationContext,string featureTitle,
字符串特征(描述)
{
_unitTestGeneratorProvider.SetTestClass(generationContext、featureTitle、featureDescription);
generationContext.Namespace.Imports.Add(新的CodeNamespaceImport(“Com.MyOrg.Custom.Core.Feature”);
generationContext.TestClass.BaseTypes.Add(“MyOrgTest”);
}
public void SetTestClassCategories(TestClassGenerationContext generationContext,
IEnumerable features(可数特征类别)
{
_unitTestGeneratorProvider.SetTestClassCategories(generationContext,featureCategories);
}
Project_B具有以下类别(请查找代码段):

公共类CustomTestGeneratorProvider:IUnitTestGeneratorProvider
{
公共CustomTestGeneratorProvider(CodeDomHelper CodeDomHelper)
{
_unitTestGeneratorProvider=新建
NUnit3TestGeneratorProvider(codeDomHelper);
CodeDomHelper=CodeDomHelper;
}
public UnitTestGeneratorTraits GetTraits()
{
return _unitTestGeneratorProvider.GetTraits();
}
public void SetTestClass(TestClassGenerationContext generationContext,string featureTitle,
字符串特征(描述)
{
_unitTestGeneratorProvider.SetTestClass(generationContext、featureTitle、featureDescription);
}
public void SetTestClassCategories(TestClassGenerationContext generationContext,
IEnumerable features(可数特征类别)
{
_unitTestGeneratorProvider.SetTestClassCategories(generationContext,featureCategories);
}
如果你看SetTestClass类中的方法有不同的逻辑实现。这是唯一一个对我来说是维护的方法。请注意,两个项目做相同的事情,但它们的用户不同。在发布时,如果我在项目A中更改,我也应该注意或考虑项目B


我希望最小化此维护。我应该做什么来减少维护?如何避免代码重复?在这种情况下。

使用此类和方法的“基本实现”创建一个单独的项目。如果需要仅对一个进行修改,请使用覆盖来覆盖该方法


参考:

获取类的所有公共部分,并从中创建一个抽象基类。 保留
SetTestClass
方法
abstract

将此类放在单独的dll中:

public abstract class TestGeneratorProvider : IUnitTestGeneratorProvider
{
    public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
    {
        _unitTestGeneratorProvider = new 
        NUnit3TestGeneratorProvider(codeDomHelper);
        CodeDomHelper = codeDomHelper;
    }

    public UnitTestGeneratorTraits GetTraits()
    {
        return _unitTestGeneratorProvider.GetTraits();
    }

    public abstract void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
        string featureDescription)

    public void SetTestClassCategories(TestClassGenerationContext generationContext,
        IEnumerable<string> featureCategories)
    {
        _unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
    }
}
并在项目B中执行相同的操作:

public class CustomTestGeneratorProvider : TestGeneratorProvider
{
    public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
    string featureDescription)
    {
        _unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
    }
}

在两个项目中创建一些接口/基类并引用onveride?
public abstract class TestGeneratorProvider : IUnitTestGeneratorProvider
{
    public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
    {
        _unitTestGeneratorProvider = new 
        NUnit3TestGeneratorProvider(codeDomHelper);
        CodeDomHelper = codeDomHelper;
    }

    public UnitTestGeneratorTraits GetTraits()
    {
        return _unitTestGeneratorProvider.GetTraits();
    }

    public abstract void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
        string featureDescription)

    public void SetTestClassCategories(TestClassGenerationContext generationContext,
        IEnumerable<string> featureCategories)
    {
        _unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
    }
}
public class CustomTestGeneratorProvider : TestGeneratorProvider
{
    public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
    string featureDescription)
    {
        _unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
        generationContext.Namespace.Imports.Add(new CodeNamespaceImport("Com.MyOrg.Custom.Core.Feature"));
        generationContext.TestClass.BaseTypes.Add("MyOrgTest");
     }
}
public class CustomTestGeneratorProvider : TestGeneratorProvider
{
    public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
    string featureDescription)
    {
        _unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
    }
}