依赖注入查询

时间:2009-08-12 10:37:21

标签: asp.net dependency-injection

我正在启动一个包含以下项目的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对象为空。

1 个答案:

答案 0 :(得分:0)

也许有关如何从测试中调用此代码的一些细节将非常有用。

我的理解是您需要确保在应用程序生命周期的早期进行ConfigureStructureMap调用(例如,在Web项目的Global.asax中)。

之后,您将使用以下内容调用IErrorLog的实例:

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