我有两个接口由一个主类实现。我如何以实现每个合约的方式重构我的代码,每个合约的方法对于参数(例如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:那么我会非常担心那些接口太大而无法启动。您只需要对希望实现不同的方法使用显式实现,但您可以混合使用隐式和显式接口实现。 –