しかし、私はあなたの呼び出し元のメソッドは、別のポスターは、メソッドの利用可能性を述べているように、リポジトリへの書き込みを許可するかどうかを知るために必要だと思いますが必要なものである、これを行うのに最適な方法はないようです実行時ではなくコンパイル時に知られるようにする。
の解決策は、2つのインタフェース、完全な機能と制限された機能を提供しています1を提供しています1を作成することです。
public interface IRepository : IRead
{
void Write(object o);
}
public interface IRead
{
object Read();
}
リポジトリオブジェクトがトップインターフェイスを実装しています。
public class Repository : IRepository
{
private readonly string _connectionString;
public Repository(string connectionString)
{
_connectionString = connectionString;
}
public object Read()
{
// Do stuff
}
public void Write(object o)
{
// Do stuff
}
}
あなたは、接続文字列は、読み取り専用のリポジトリを要求したりせず、インタフェースの指定された型を返すために、2種類の方法を公開するかどうかを判断するクラスを持つことができます(コンパイル時にタイプを知っておく必要があるという意味) 。
public static class RepositoryFactory
{
public static bool ConnectionStringIsReadOnly(string connectionString)
{
return connectionString.Contains("user=hacker");
}
public static IRead GetReadOnlyRepository(string connectionString)
{
return new Repository(connectionString);
}
public static IRepository GetRepository(string connectionString)
{
if (ConnectionStringIsReadOnly(connectionString)) throw new ArgumentException(@"Given connectionString is not allowed full repository access", "connectionString");
return new Repository(connectionString);
}
}
次のようにあなたは、あなたはあなたがIRepositoryのかだけIREADのバージョンを持っていることを確認することでフルアクセスを必要とするアクションを実行しようポイントをseperating、これを消費することができます。すべてのご提案をお寄せいただきありがとうございますが、私は「ONE」はこれに答えていない... tiは、私はそれに行くだろうと思い、FactoryRepository /インタフェースの提案がより採用可能見つけBUがあると思い
public class Program
{
public void ConsumeRepository(string connectionString)
{
IRead reader = null;
IRepository repository = null;
if (RepositoryFactory.ConnectionStringIsReadOnly(connectionString))
reader = RepositoryFactory.GetReadOnlyRepository(connectionString);
else
{
repository = RepositoryFactory.GetRepository(connectionString);
reader = repository;
}
object o = reader.Read();
// do something with o
// if allowed then write o to repository
if (repository != null)
{
repository.Write(o);
}
}
}
...おかげですべて一回再び...おそらく – user402186