我正在启动一个包含以下项目的Web应用程序:
Booking.Web Booking.Services Booking.DataObjects Booking.Data
我只在数据项目中使用存储库模式。无论发生什么,所有服务都是一样的。但是,如果客户想要使用Access,它将使用与客户想要使用SQL Server不同的数据存储库。
我有StructureMap,并希望能够执行以下操作:
Web项目不受影响。它是一个Web表单应用程序,只能了解服务项目和dataobjects项目。
调用服务时,它将使用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对象为空。
答案 0 :(得分:0)
也许有关如何从测试中调用此代码的一些细节将非常有用。
我的理解是您需要确保在应用程序生命周期的早期进行ConfigureStructureMap调用(例如,在Web项目的Global.asax中)。
之后,您将使用以下内容调用IErrorLog的实例:
IErrorLog log = StructureMap.ObjectFactory.GetNamedInstance<IErrorLog>();