【发布时间】:2018-02-08 06:30:39
【问题描述】:
我想知道是否有,如何使用 Ninject 进行参数存在检查?
我指的是:让我们有一个理论类和一个接口:
public interface IFileExistenceCheck
{
bool FileExist();
}
public class FileExistenceChecker : IFileExistenceCheck
{
private readonly string filePath;
private readonly IFileSystem fileSystem;
public FileExistenceChecker(IFileSystem fileSystem, string filePath)
{
this.fileSystem = fileSystem;
this.filePath = filePath;
}
public bool FileExist()
{
return this.fileSystem.File.Exists(this.filePath);
}
}
然后在代码中的某处,我将通过内核获取IFIleExistenceCheck 接口的实例,如下所示:
public class Foo()
{
public void Bar()
{
// do something
var filePath = SomeMagicString;
var filePathArgument = new ConstructorArgument("filePath", filePath); // <- This part I do not really like
var checker = Kernel.Get<IFileExistenceCheck>(filePathArgument);
var fileExist = checker.FileExist();
// do the rest of code
}
}
这可以正常工作,问题是,只要文件路径参数的名称保持不变,它就可以工作。假设有一天有人会决定,filePath 是不必要的,并将其重命名为 path。代码本身仍会编译,但在有人真正调用Bar() 方法之前不会导致任何错误。
有什么办法可以防止这种情况发生吗?
我真的不想暴露filePath。我仍然希望它作为构造函数的参数传递。我不想将FileCheck() 的签名更改为接受filePath 作为参数,我什至不想将filePath 更改为可公开访问的字段。
【问题讨论】:
-
filePath在启动时是否已知?还是运行时数据?
标签: c# .net dependency-injection inversion-of-control ninject