2009-08-12 19 views
0

私は次のプロジェクトが含まれているWebアプリケーション始めている:私は、リポジトリのパターンを使用してい依存性注入のクエリ

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

を私のデータプロジェクトのみ。何が起きても、すべてのサービスは同じになります。ただし、顧客がAccessを使用する場合、顧客がSQL Serverを使用する場合とは異なるデータ・リポジトリを使用します。

私はのStructureMapを持っているし、次の操作を行うことができるようにしたい:

Webプロジェクトは影響を受けません。これは、サービスプロジェクトとdataobjectsプロジェクトについてのみ知るWebフォームアプリケーションです。

サービスが呼び出されると、(使用するデータリポジトリを確認するためにbootstrapper.csファイルを参照して)StructureMapが使用されます。

私は私のWebプロジェクトからこのサービスを呼び出すことができるようにしたい
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(); 
    } 
} 

、データ・アクセスに使用するリポジトリを定義せずに:

サービスクラスの例は、エラーロギングクラスです。サービスプロジェクトの私の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

はこの答えを見てみましょう:あなたはのようなものを使用してIErrorLogのインスタンスを求めることになる。その後

http://stackoverflow.com/questions/589374/how-to-use-dependency -injection-with-asp-net/3849338#3849338 – Steven

答えて

0

おそらく、テストからこのコードをどのように呼び出すかに関するいくつかの詳細が役に立ちます。

私の理解では、ConfigureStructureMapの呼び出しがアプリケーションライフタイムの早い段階で行われたことを確認する必要があります(WebプロジェクトのGlobal.asaxなど)。

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