我正在构建一个博客引擎来测试一些概念,例如我们的TDD和使用控制反转...我想出了一个设置,我有一个通用的IBlogRepository接口,所以我可以同时支持SQL和XML.
public interface IBlogRepository : IRepository { Post GetPostById(Guid postId); Post GetPostByFriendlyUrl(string friendlyUrl); ListGetPostsByAuthor(string userName); List GetPostByTags(params string[] tags); List 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; }
SQL博客存储库不需要fileReader,directoryReader和dataPath.
这使得进行控制反转以加载IBlogRepository的问题变得不可能,并且由于它们具有完全不同的ctors,因此也很难一般地使用它们.
我必须传递它们的原因是因为如果我只使用File.Open/Directory.GetFiles那么我将无法在没有硬盘驱动器上的XML文件的情况下对该类进行单元测试.
我不明白为什么你的两个IBlogRepository实现有不同的ctor签名,这使得IoC"不可能"; 相反,这是IoC中的常见情况.它解决的方法是你的IoC框架(只有你的IoC框架)负责调用所需的IBlogRepository实现的ctor.因此,您的IoC配置文件(或您使用的任何其他配置方法)知道正在使用哪个实现(毕竟有些必须),但IBlogRepository服务的使用者只能通过其接口访问它.