2009-08-12 70 views
0

我開始一個包含以下項目的Web應用程序:依賴注入查詢

Booking.Web Booking.Services Booking.DataObjects Booking.Data

我使用的存儲庫模式我的數據項目只。無論發生什麼,所有服務都是一樣的。但是,如果客戶想要使用Access,它將使用與客戶想要使用SQL Server的情況不同的數據存儲庫。

我有StructureMap,並希望能夠做到以下幾點:

Web項目不受影響。這是一個只會瞭解服務項目和數據對象項目的Web表單應用程序。

當調用服務時,它將使用StructureMap(通過查找bootstrapper.cs文件)來查看要使用哪個數據存儲庫。

一個服務類的一個實例是錯誤日誌類:

public class ErrorLog : IErrorLog 
{ 
    ILogging logger; 

    public ErrorLog() 
    { 

    } 

    public ErrorLog(ILogging logger) 
    { 
     this.logger = logger; 
    } 

    public void AddToLog(string errorMessage) 
    { 
     try 
     { 
      AddToDatabaseLog(errorMessage); 
     } 

     catch (Exception ex) 
     { 
      AddToFileLog(ex.Message); 
     } 

     finally 
     { 
      AddToFileLog(errorMessage); 
     } 
    } 

    private void AddToDatabaseLog(string errorMessage) 
    { 
     ErrorObject error = 
      new ErrorObject 
      { 
       ErrorDateTime = DateTime.Now, 
       ErrorMessage = errorMessage 
      }; 

     logger.Insert(error); 
    } 

    private void AddToFileLog(string errorMessage) 
    { 
     // TODO: Take this value from the web.config instead of hard coding it 
     TextWriter writer = new StreamWriter(@"E:\Work\Booking\Booking\Booking.Web\Logs\ErrorLog.txt", true); 
     writer.WriteLine(DateTime.Now.ToString() + " ---------- " + errorMessage); 
     writer.Close(); 
    } 
} 

我希望能夠調用從我的web項目這項服務,而不定義要用於數據訪問的存儲庫。我的服務項目中的boostrapper.cs文件被定義爲:

public class Bootstrapper 
{ 
    public static void ConfigureStructureMap() 
    { 
     ObjectFactory.Initialize(x => 
     { 
      x.AddRegistry(new ServiceRegistry()); 
     } 
     ); 
    } 

    public class ServiceRegistry : Registry 
    { 
     protected override void configure() 
     { 
      ForRequestedType<IErrorLog>().TheDefaultIsConcreteType<Booking.Services.Logging.ErrorLog>(); 
      ForRequestedType<ILogging>().TheDefaultIsConcreteType<SqlServerLoggingProvider>(); 
     } 
    } 
} 

我還需要什麼來讓它工作?當我定義一個測試時,ILogger對象爲null。

+0

看看這個答案:http://stackoverflow.com/questions/589374/how-to-use-dependency步噴射-與-ASP-NET/3849338#3849338 – Steven 2010-10-03 10:14:46

回答

0

也許關於如何從測試中調用此代碼的一些細節將會很有用。

我的理解是,您需要確保ConfigureStructureMap調用早於應用程序生命週期(例如,在Web項目中的Global.asax中)。

之後,你會被要求使用類似IErrorLog的實例:

IErrorLog log = StructureMap.ObjectFactory.GetNamedInstance<IErrorLog>();