23

我对 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;
    }
}
4

2 回答 2

37

随着声明:

var myService = kernel.Get<MyService>();

您正在尝试解析MyService,因为该MyService类型未在内核中注册,Ninject 会将其视为自绑定类型。

所以它不会使用你WithConstructorArgument来解决,"testEmail"因为它只会用于Bind<IMyService>()这就是你得到异常的原因。

因此,如果您已注册MyService

string testEmail = "test@example.com";
kernel.Bind<IMyService>().To<MyService>()
      .WithConstructorArgument("testEmail", testEmail);

那么你应该通过注册的接口(IMyService)来解决它:

var myService = kernel.Get<IMyService>();
于 2012-11-20T16:41:22.703 回答
2

虽然 nemesv 有正确的响应,但我遇到了同样的错误,我的解决方案是 /bin 中的恶意 DLL。我已经重构并删除/移动了一些仍然存在于我的旧 DLL 中的类。解决方案 - 删除旧的 DLL。

于 2016-07-19T18:57:54.523 回答