son*_*tek 4 .net c# tdd inversion-of-control
我正在构建一个博客引擎来测试一些概念,例如我们的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);
}
Run Code Online (Sandbox Code Playgroud)
问题是XML存储库需要不同于数据库的资源...这里是构造函数:
public XmlBlogRepository(string dataPath, IFileReader fileReader, IDirectoryReader directoryReader, ILogger logger)
{
this.dataPath = dataPath;
this.fileReader = fileReader;
this.directoryReader = directoryReader;
this.Logger = logger;
}
Run Code Online (Sandbox Code Playgroud)
SQL博客存储库不需要fileReader,directoryReader和dataPath.
这使得进行控制反转以加载IBlogRepository的问题变得不可能,并且由于它们具有完全不同的ctors,因此也很难一般地使用它们.
我必须传递它们的原因是因为如果我只使用File.Open/Directory.GetFiles那么我将无法在没有硬盘驱动器上的XML文件的情况下对该类进行单元测试.
我不明白为什么你的两个IBlogRepository实现有不同的ctor签名,这使得IoC"不可能"; 相反,这是IoC中的常见情况.它解决的方法是你的IoC框架(只有你的IoC框架)负责调用所需的IBlogRepository实现的ctor.因此,您的IoC配置文件(或您使用的任何其他配置方法)知道正在使用哪个实现(毕竟有些必须),但IBlogRepository服务的使用者只能通过其接口访问它.
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |