我有兩個接口由一個主類實現。我如何以實現每個合約的方式重構我的代碼,每個合約的方法對於參數(例如DatabaseName)具有不同的值。合同的不同屬性值
實施例:
- 的Class1器具接口1,接口2
- Interface1.GetData()具有數據庫名設置爲數據庫1
- Interface2.GetData()具有數據庫名組到數據庫2
我可以在方法GetData()中配置這些值,但我想要一個更乾淨的方法。
任何模式建議是DI,域驅動,甚至完成上述的基本繼承示例是我正在尋找。
我有兩個接口由一個主類實現。我如何以實現每個合約的方式重構我的代碼,每個合約的方法對於參數(例如DatabaseName)具有不同的值。合同的不同屬性值
實施例:
我可以在方法GetData()中配置這些值,但我想要一個更乾淨的方法。
任何模式建議是DI,域驅動,甚至完成上述的基本繼承示例是我正在尋找。
這聽起來像所有你需要的是explicit interface implementation:
public class Class1 : Interface1, Interface2
{
// Note the lack of access modifier here. That's important!
Data Interface1.GetData()
{
// Implementation for Interface1
}
Data Interface2.GetData()
{
// Implementation for Interface2
}
}
顯然,這兩種方法都可以撥打的共同方法與參數指定數據庫名稱或類似。
重構通常是通過注意到代碼異味的動機和事實上,你最終在一個情況下,你必須實現2抽象揭露類似的功能是代碼異味。 沒有更多的理解這個問題,我可能無法給你一個確定的答案,但有限的理解,這是我會建議。有兩個不同的具體實現,每個實現一個接口,並有一個工廠將被注入到客戶端,並使客戶做出這些實現需要哪一個的慎重決定。如果這些具體的類共享共同的功能,你總是可以將它抽象成一個共同的父類。
public interface ISQLReader
{
string GetData();
}
public interface IOracleReader
{
string GetData();
}
public abstract class Reader
{
protected void CommonFunctionaility()
{
}
}
public class MSSQLReader : Reader, ISQLReader
{
public string GetData()
{
return "MSSQL";
}
}
public class OracleReader : Reader, IOracleReader
{
public string GetData()
{
return "Oracle";
}
}
public interface IReaderFactory
{
OracleReader CreateOracleReader();
MSSQLReader CreateMSSQLReader();
}
public class ReaderFactory : IReaderFactory
{
public MSSQLReader CreateMSSQLReader() => new MSSQLReader();
public OracleReader CreateOracleReader() => new OracleReader();
}
public class ReaderClient
{
private IReaderFactory _factory;
public ReaderClient(IReaderFactory factory)
{
this._factory = factory;
}
}
顯式接口實現技術,直到客戶端已經並通過使一個深思熟慮的決定明確造型,那裏應該限制的功能使用。
我的想法是剛剛吹襲喬恩斯威特甚至回答新手問題,如果我在這兩個接口有100個方法怎麼辦? –
@ZohaibAmin:那麼我會非常擔心那些接口太大而無法啓動。您只需要對希望實現不同的方法使用顯式實現,但您可以混合使用隱式和顯式接口實現。 –