似乎没有一个完美的方法来做到这一点,但是我认为你的调用方法需要知道它是否被允许写入存储库,因为另一位发帖人表示方法的可用性是需要的在编译时而不是运行时知道。
解决方案是创建两个接口,一个提供完整功能,一个提供有限功能。
public interface IRepository : IRead
{
void Write(object o);
}
public interface IRead
{
object Read();
}
然后您的 Repository 对象实现顶部接口。
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 only 的版本来区分您尝试执行需要完全访问权限的操作的点。
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);
}
}
}