Кажется, нет идеального способа сделать это, однако я думаю, что ваш вызывающий метод должен знать, разрешено ли ему писать в репозиторий, так как другой автор заявил, что доступность методов - это то, что нужнобыть известным во время компиляции, а не во время выполнения.
Решение будет состоять в том, чтобы создать два интерфейса, один с полной функциональностью, а другой с ограниченной функциональностью.
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только.
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);
}
}
}