C#学习教程:Ninject:将构造函数参数绑定到其他对象的属性目前,我将整个对象注入到每个需要它的对象的构造函数中,如下所示:publicinterfaceIConfig{stringUsername{get;}字符串密码{得到;}//...其他设置}publicclassFoo:IFoo{privatereadonlystringusername;私有只读字符串密码;publicFoo(IConfigconfig){this.username=config.Username;this.password=config.Password;缺点是IConfig包含很多设置,因为它是从配置文件中的整个反序列化创建的,所以不需要注入整个对象。我想要做的是将构造函数更改为Foo(stringusername,stringpassword)以便它只接收所需的设置。这也使得创建用于测试的Foo对象变得更容易(不必设置IConfig只是为了创建Foo)。我想像这样在我的NinjectModule中直接绑定构造函数参数:绑定到()。WithConstructorArgument("用户名",IConfig.Username).WithConstructorArgument("密码",IConfig.Password);显然这段代码不起作用,但我该怎么做呢?我最初的想法是使用NinjectModule.Kernel获取IKernel,然后获取我的IConfig对象的实例并根据需要注入属性,但NinjectModule.Kernel返回的对象没有Get()方法。您走在正确的轨道上:Kernel.Get()方法是在Ninject名称空间中的ResolutionExtensions上定义的扩展方法,因此请使用Ninject添加;它也可以在您的模块中使用。但是,您应该使用Module.Kernel的第二次重载中提供的IContext来获取没有WithConstructorArgument的内核:Bind().To().WithConstructorArgument("username",context=>context.Kernel.Get().Username).WithConstructorArgument("密码",context=>context.Kernel.Get().Password);这可能是对接口隔离原则的一个很好的假设。在这种情况下,定义另一个接口,例如包含Username和Password属性的ICredentialConfigIConfig,然后让IConfig实现这个接口。publicInterfaceICredentialConfig{string用户名{get;}字符串密码{得到;}}publicInterfaceIConfig:ICredentialConfig{//...其他设置}现在让Foo依赖于ICredentialConfig而不是IConfig。那你就可以:以上是C#学习教程:Ninject:Bindtheconstructorparameterstothepropertiesofotherobjects。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——使用Ninject注入JsonConfig,而不是使用硬编码的参数名。实现/模拟ICredentialConfig以在测试中实例化Foo,而无需实现完整的IConfig接口。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
