私は次のプロジェクトが含まれている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でした。
はこの答えを見てみましょう:あなたはのようなものを使用してIErrorLogのインスタンスを求めることになる。その後
http://stackoverflow.com/questions/589374/how-to-use-dependency -injection-with-asp-net/3849338#3849338 – Steven