複数の別々のプラグイン作成者が実装できる抽象オブジェクトがあるとしましょう。(たとえば、バグデータベース接続)ビットのコンシューマーが特定のプラグインタイプごとに処理する必要がないようにします。
また、構成ファイルを解析するプロセスと、データベースプラグインなどを実際に初期化するプロセスを分離したいと思います。
そのために、私は次のようなものを思いついた:
public interface IConfiguration
{
// No members
}
public interface IConnection
{
// Members go in here
void Create();
void Update();
void Delete();
}
public interface IConnectionProvider
{
// Try to interpret file as a configuration, otherwise return null
IConfiguration ParseConfiguration(Stream configurationContents);
IConnection Connect(IConfiguration settings);
}
public class ThingyRepository
{
// Lets say there is a constructor that initializes this with something
List<IConnectionProvider> providers;
// Insulates people from the actual connection provider
KeyValuePair<IConfiguration, IConnectionProvider> Parse(string filename)
{
IConnection result = null;
IConnectionProvider resultProvider = null;
foreach (var provider in this.providers)
{
using (Stream fs = OpenTheFileReadonly(filename))
{
IConnection curResult = provider.ParseConfiguration(fs);
if (curResult == null)
{
continue;
}
else
{
if (result == null)
{
result = curResult;
resultProvider = provider;
}
else
{
throw new Exception ("ambguity!");
}
}
}
}
if (result == null)
{
throw new Exception ("can't parse!");
}
return new KeyValuePair<IConfiguration, IConnectionProvider>(
result, resultProvider);
}
}
私の質問は、示されたファイルからロードされた設定に対する不透明なハンドルとして機能するはずのこの空のインターフェースを持っているということです。IConnectionProviderの特定の実装者は、ファイルからロードする構成に必要なビットを知っていますが、このライブラリのユーザーはその情報から隔離されている必要があります。
しかし、空のインターフェースを持つことは私には奇妙に思えます。この種のことは理にかなっていますか、それとも私はひどく間違ったことをしましたか?