2011-05-02 155 views
0

我有這個變量,它是一類在業務層接口的實例。 我需要從數據訪問層,業務層,最後到表示層發送消息。我在數據訪問我的課「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從未分配,並且將永遠是空」

我怎樣才能解決這個問題?

+4

您是否真的看過該消息?它回答你的問題。 – jeroenh 2011-05-02 14:42:25

+0

由於需要創建一個新對象並將其分配給_imageLogBuilder,因此您正在收到該錯誤。你不能創建一個接口的實例,必須有一個實現該接口的類(例如'公共類MyImageLogBuidler:IImageLogBuilder {...}')。然後,將該類的新實例分配給您的變量。請參閱下面我的答案更新。 – rsbarro 2011-05-02 17:19:21

回答

1

您需要分配實現IImageLogBuilder接口_imageLogBuilder領域的類的實例。

現在你的領域總是會有null值。

例如:

private readonly IImageLogBuilder _imageLogBuilder = new ImageLogBuilder(); 
1

也許初始化構造_imageLogBuilder

public class LogBinaryWriter : ILogBinaryWriter 
{ 
    private readonly IImageLogBuilder _imageLogBuilder; 

    public LogBinaryWriter(IImageLogBuilder imageLogBuilder) 
    { 
     _imageLogBuilder = imageLogBuilder; 
    } 
.... 


} 
+0

我不能構造一個構造函數,因爲我在其他類中使用了LogBinaryWriter的默認構造函數。請另一種方式? – ale 2011-05-02 15:03:45

+1

你能刪除'readonly'屬性並引入setter嗎? – 2011-05-02 15:19:09

+0

這樣的事情? private IImageLogBuilder _imageLogBuilder {get;私人設置; } ... – ale 2011-05-02 15:22:07

3

實例化的IImageLogBuilder一個實例在構造函數用於LogBinaryWriter並將其分配給_imageLogBuilder。你將不得不做,在構造函數中,因爲你已經標記爲readonly_imageLogBuilder

例如,假設你有一個名爲MyImageLogBuilder類,它實現IImageLogBuilder

public LogBinaryWriter() 
{ 
    _imageLogBuilder = new MyImageLogBuilder(); 
} 

你也可以重載構造函數,因此你可以通過IImageLogBuilder要上使用(查找構造函數注入更多信息這種模式):

public LogBinaryWriter(IImageLogBuilder imageLogBuilder) 
{ 
    _imageLogBuilder = imageLogBuilder; 
} 

記住,你將需要實現IImageLogBuilder接口,能夠創建一個新的實例並將其分配給T A類他_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

您從不設置_imageLogBuilder變量的值。而且,由於您將其標記爲readonly,因此可以設置的唯一位置是在字段初始值設定項或構造函數中。

您的意思是做這樣的事情,也許?

private readonly IImageLogBuilder _imageLogBuilder = // get the value from somewhere else, or make a new one