在控制台应用程序中,我想使用通常需要将当前 http 上下文传递给其构造函数的服务。我正在使用 Ninject,我想我可以简单地伪造一个 http 上下文并定义正确的绑定,但是我已经为此苦苦挣扎了几个小时而没有成功。
细节:
该服务实际上是一个来自 ASP.Net MVC 项目的邮件服务。我也在为 IoC 使用 Ninject。邮件服务需要将当前的 http 上下文传递给它的构造函数。我按如下方式进行绑定:
kernel.Bind<IMyEmailService>().To<MyEmailService>()
.WithConstructorArgument("httpContext", ninjectContext => new HttpContextWrapper(HttpContext.Current));
但是,我现在想在控制台应用程序中使用此邮件服务,该应用程序将用于在夜间运行自动化任务。为了做到这一点,我想我可以简单地伪造一个 http 上下文,但我已经为此苦苦挣扎了几个小时。
上下文中的所有邮件服务需求都是这两个属性:
- httpContext.Request.UserHostAddress
- httpContext.Request.RawUrl
我以为我可以做这样的事情,但是:
定义我自己的假请求类:
public class AutomatedTaskHttpRequest : SimpleWorkerRequest
{
public string UserHostAddress;
public string RawUrl;
public AutomatedTaskHttpRequest(string appVirtualDir, string appPhysicalDir, string page, string query, TextWriter output)
: base(appVirtualDir, appPhysicalDir, page, query, output)
{
this.UserHostAddress = "127.0.0.1";
this.RawUrl = null;
}
}
定义我自己的上下文类:
public class AutomatedTasksHttpContext
{
public AutomatedTaskHttpRequest Request;
public AutomatedTasksHttpContext()
{
this.Request = new AutomatedTaskHttpRequest("", "", "", null, new StringWriter());
}
}
并在我的控制台应用程序中按如下方式绑定它:
kernel.Bind<IUpDirEmailService>().To<UpDirEmailService>()
.WithConstructorArgument("httpContext", ninjectContext => new AutomatedTasksHttpContext());
不幸的是,这行不通。我尝试了各种变体,但没有一个有效。请多多包涵。所有 IoC 的东西对我来说都很新鲜。