我对WithConstructorArgument的理解可能是错误的,因为以下内容不起作用:
我有一个服务,我们称之为MyService,其构造函数正在接受多个对象,以及一个名为testEmail的字符串参数。对于这个字符串参数,我添加了以下Ninject绑定:
string testEmail = "test@example.com";
kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);
但是,在执行以下代码行时,我得到一个例外:
var myService = kernel.Get<MyService>();
以下是我得到的例外情况:
激活字符串时出错没有匹配的绑定可用,而且 type不可自绑定。激活路径:
2)注射 依赖字符串到类型构造函数的参数testEmail中 为MyService
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;
}
}
答案 0 :(得分:34)
声明:
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>();
答案 1 :(得分:1)
虽然nemesv有正确的响应,但我遇到了同样的错误,我的解决方案是我/ bin中的恶意DLL。我已经重构并删除/移动了一些仍然存在于我的旧DLL中的类。解决方案 - 删除旧的DLL。