我開始一個包含以下項目的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。
看看這個答案:http://stackoverflow.com/questions/589374/how-to-use-dependency步噴射-與-ASP-NET/3849338#3849338 – Steven 2010-10-03 10:14:46