我对 WithConstructorArgument 的理解可能是错误的,因为以下内容不起作用:
我有一个服务,我们称之为 MyService,它的构造函数采用多个对象,以及一个名为 testEmail 的字符串参数。对于这个字符串参数,我添加了以下 Ninject 绑定:
string testEmail = "test@example.com";
kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);
但是,在执行以下代码行时,出现异常:
var myService = kernel.Get<MyService>();
这是我得到的例外:
激活字符串时出错 没有匹配的绑定可用,并且类型不是自绑定的。激活路径:
2)将依赖字符串注入MyService类型的构造函数的参数testEmail
1)请求MyService建议:
1) 确保您已为字符串定义绑定。
2) 如果绑定是在模块中定义的,请确保该模块已加载到内核中。
3) 确保您没有意外创建多个内核。
4) 如果您使用构造函数参数,请确保参数名称与构造函数参数名称匹配。
5) 如果您使用自动模块加载,请确保搜索路径和过滤器正确。
我在这里做错了什么?
更新:
这是 MyService 构造函数:
[Ninject.Inject]
public MyService(IMyRepository myRepository, IMyEventService myEventService,
IUnitOfWork unitOfWork, ILoggingService log,
IEmailService emailService, IConfigurationManager config,
HttpContextBase httpContext, string testEmail)
{
this.myRepository = myRepository;
this.myEventService = myEventService;
this.unitOfWork = unitOfWork;
this.log = log;
this.emailService = emailService;
this.config = config;
this.httpContext = httpContext;
this.testEmail = testEmail;
}
我对所有构造函数参数类型都有标准绑定。只有 'string' 没有绑定,而 HttpContextBase 的绑定有点不同:
kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(new HttpContext(new MyHttpRequest("", "", "", null, new StringWriter()))));
MyHttpRequest 定义如下:
public class MyHttpRequest : SimpleWorkerRequest
{
public string UserHostAddress;
public string RawUrl;
public MyHttpRequest(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;
}
}