Я создаю движок блога для тестирования некоторых концепций, таких как TDD и использование инверсии управления ... Я придумал установку, в которой у меня был бы общий интерфейс IBlogRepository, чтобы я мог поддерживать как SQL, так и XML.
public interface IBlogRepository : IRepository
{
Post GetPostById(Guid postId);
Post GetPostByFriendlyUrl(string friendlyUrl);
List<Post> GetPostsByAuthor(string userName);
List<Post> GetPostByTags(params string[] tags);
List<Author> Authors { get; }
void Delete(Post post);
void Delete(Comment comment);
void Save(Post post);
void Save(Comment comment);
}
Проблема в том, что для репозитория XML требуются ресурсы, отличные от базы данных ... Вот конструктор:
public XmlBlogRepository(string dataPath, IFileReader fileReader, IDirectoryReader directoryReader, ILogger logger)
{
this.dataPath = dataPath;
this.fileReader = fileReader;
this.directoryReader = directoryReader;
this.Logger = logger;
}
fileReader, directoryReader и dataPath не нужны репозиторию блогов SQL.
Это делает невозможным использование инверсии управления для загрузки IBlogRepository, а также очень затрудняет их общее использование, поскольку они имеют совершенно разные ctors.
Причина, по которой я должен передать их, заключается в том, что, если бы я просто использовал File.Open/Directory.GetFiles, я бы не смог выполнить модульное тестирование класса, не имея файлов XML на жестком диске.