我有这个变量,它是业务层中类的接口的实例。 我需要从数据访问层发送消息,到业务层,最后到表示层。我的数据访问类“LogBinaryWriter”我有这个:
public class LogBinaryWriter : ILogBinaryWriter
{
private readonly IImageLogBuilder _imageLogBuilder;
public void WriteFrameCodes(string filePath, int logSelected)
{
var fileExists = FileExists(binaryFilePath);
if (fileExists == true)
{
_imageLogBuilder.displayMessage("The file " + binaryFileName + " exist. Dou you want overwrite it? (Y/N)");
}
}
}
我有一条消息:“值 _imageLogBuilder 永远不会被分配,并且始终为空”
我该如何解决这个问题?
答案 0 :(得分:3)
在IImageLogBuilder
的构造函数中实例化LogBinaryWriter
的实例,并将其分配给_imageLogBuilder
。您必须在构造函数中执行此操作,因为_imageLogBuilder
标记为readonly
。
例如,假设您有一个名为MyImageLogBuilder
的类实现IImageLogBuilder
:
public LogBinaryWriter()
{
_imageLogBuilder = new MyImageLogBuilder();
}
您还可以重载构造函数,以便传入要使用的IImageLogBuilder
(查找构造函数注入以获取有关此模式的更多信息):
public LogBinaryWriter(IImageLogBuilder imageLogBuilder)
{
_imageLogBuilder = imageLogBuilder;
}
请记住,您需要一个实现IImageLogBuilder
接口的类,以便能够创建新实例并将其分配给_imageLogBuilder
变量。例如:
public interface IImageLogBuilder
{
void Log(string message);
}
//The class below IMPLEMENTS the IImageLogBuilder interface
public class MyImageLogBuilder : IImageLogBuilder
{
//Implement IImageLogBuilder methods here
public void Log(string message)
{
//Log message
}
}
如果您有类似上面定义的类的内容,那么您可以在LogBinaryWriter
构造函数中执行以下操作,并且您将不再获得空引用错误。
public LogBinaryWriter()
{
_imageLogBuilder = new MyImageLogBuilder();
}
答案 1 :(得分:1)
您需要将实现IImageLogBuilder
接口的类的实例分配给_imageLogBuilder
字段。
现在,您的字段的值始终为null
。
例如:
private readonly IImageLogBuilder _imageLogBuilder = new ImageLogBuilder();
答案 2 :(得分:1)
或许在构造函数中初始化_imageLogBuilder
?
public class LogBinaryWriter : ILogBinaryWriter
{
private readonly IImageLogBuilder _imageLogBuilder;
public LogBinaryWriter(IImageLogBuilder imageLogBuilder)
{
_imageLogBuilder = imageLogBuilder;
}
....
}
答案 3 :(得分:1)
您永远不会设置_imageLogBuilder
变量的值。由于您将其标记为readonly
,因此可以设置的唯一位置是字段初始值设定项或构造函数。
你是不是也想做这样的事情?
private readonly IImageLogBuilder _imageLogBuilder = // get the value from somewhere else, or make a new one