[英]How to avoid code duplication in c# project
我遇到了使用specflow自定義插件的情況。 使用specflow自定義插件,我有兩個不同的項目,分別是project_A和project_B。 這兩個項目都有自己的存儲庫。
Project_A具有下面的類(請找到代碼片段):
public class CustomTestGeneratorProvider : IUnitTestGeneratorProvider
{
public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
{
_unitTestGeneratorProvider = new
NUnit3TestGeneratorProvider(codeDomHelper);
CodeDomHelper = codeDomHelper;
}
public UnitTestGeneratorTraits GetTraits()
{
return _unitTestGeneratorProvider.GetTraits();
}
public 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 void SetTestClassCategories(TestClassGenerationContext generationContext,
IEnumerable<string> featureCategories)
{
_unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
}
Project_B具有下面的類(請找到代碼片段):
public class CustomTestGeneratorProvider : IUnitTestGeneratorProvider
{
public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
{
_unitTestGeneratorProvider = new
NUnit3TestGeneratorProvider(codeDomHelper);
CodeDomHelper = codeDomHelper;
}
public UnitTestGeneratorTraits GetTraits()
{
return _unitTestGeneratorProvider.GetTraits();
}
public void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
string featureDescription)
{
_unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
}
public void SetTestClassCategories(TestClassGenerationContext generationContext,
IEnumerable<string> featureCategories)
{
_unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
}
如果看一下SetTestClass方法中的類有不同的實現邏輯。 這是對我唯一的維護方法。 請注意,兩個項目都做相同的事情,但它們的用戶不同。 發布時如果我在project_A中進行更改,我也應該注意或考慮project_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);
}
}
在項目A中,添加對該dll的引用,繼承此類並提供相關的SetTestClass
實現:
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");
}
}
並在項目B中執行相同的操作:
public class CustomTestGeneratorProvider : TestGeneratorProvider
{
public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
string featureDescription)
{
_unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
}
}
使用此類和方法的“基礎實現”創建一個單獨的項目。 如果您需要專門對一個進行修改,請使用override覆蓋該方法。
參考: https : //docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/override
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.