Как мне использовать IoC в такой настройке? Есть ли лучший способ проверить это? - PullRequest
4 голосов
/ 31 января 2009

Я создаю движок блога для тестирования некоторых концепций, таких как 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 на жестком диске.

Ответы [ 2 ]

7 голосов
/ 31 января 2009

Я не понимаю, почему тот факт, что ваши две реализации IBlogRepository имеют разные сигнатуры ctor, делает IoC "невозможным"; напротив, это обычный сценарий в IoC. Способ решения этой проблемы заключается в том, что ваша платформа IoC (и только ваша платформа IoC) отвечает за вызов ctor требуемой реализации IBlogRepository. Таким образом, ваш файл конфигурации IoC (или любой другой подход к конфигурации, который вы используете) знает, какая реализация используется (что-то должно, в конце концов), но потребители сервиса IBlogRepository получают к нему доступ только через его интерфейс.

1 голос
/ 31 января 2009

я думаю, что провайдер будет соответствовать вашим потребностям, внедрив провайдера, в который вы обернете ресурсы

здесь хорошая ссылка

...