c# – 使用Ninject基于字符串创建对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用Ninject基于字符串创建对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2147字,纯文字阅读大概需要4分钟。
内容图文
![c# – 使用Ninject基于字符串创建对象](/upload/InfoBanner/zyjiaocheng/805/883baa57a89e4ec6a3f17a4307cf89b5.jpg)
我需要根据从数据库中获取的字符串创建共享公共接口(IFoo)的对象.我有“A”,我需要填写AFoo,我得到“B”,我需要生产BFoo等.我应该做的第一件事就是工厂.但是创建的对象(AFoo,BFoo)需要注入其依赖项(并且这些依赖项需要更多的依赖项和一些偶数参数).对于所有注射我使用Ninject,它本身似乎是一个奇特的工厂.要在我的工厂中创建对象,我通过构造函数注入一个Ninject的内核.这是理想的方式吗?
interface IBar { }
class Bar : IBar {
public Bar(string logFilePath) { }
}
interface IFoo { }
class AFoo : IFoo {
public AFoo(IBar bar) { }
}
class BFoo : IFoo { }
class FooFactory : IFooFactory {
private IKernel _ninjectKernel;
public FooFactory(IKernel ninjectKernel) {
_ninjectKernel = ninjectKernel;
}
IFoo GetFooByName(string name) {
switch (name) {
case "A": _ninjectKernel.Get<AFoo>();
}
throw new NotSupportedException("Blabla");
}
}
class FooManager : IFooManager {
private IFooFactory _fooFactory;
public FooManager(IFooFactory fooFactory) {
_fooFactory = fooFactory;
}
void DoNastyFooThings(string text) {
IFoo foo = _fooFactory.GetFooByName(text);
/* use foo... */
}
}
class Program {
public static void Main() {
IKernel kernel = new StandardKernel();
kernel.Bind<IBar>.To<Bar>();
kernel.Bind<IFooManager>.To<FooManager>();
kernel.Bind<IFooFactory>.To<FooFactory>();
IFooManager manager = kernel.Get<IFooManager>(new ConstructorArgument("ninjectKernel", kernel, true));
manager.DoNastyFooThings("A");
}
}
解决方法:
Ninject的IKernel的Get< T>()方法有一个重载,它接受一个name参数来获取一个命名实例.
用法是:
public int Main()
{
IKernel kernel = new StandardKernel();
kernel.Bind<IFoo>().To<AFoo>().Named("AFoo");
kernel.Bind<IFoo>().To<BFoo>().Named("BFoo");
//returns an AFoo instance
var afoo = kernel.Get<IFoo>("AFoo");
//returns an BFoo instance
var bfoo = kernel.Get<IFoo>("BFoo");
}
关于将Ninject的IKernel注入Factory的构造函数的问题,我不认为应该有任何问题.
你的工厂应该是这样的:
public interface IFooFactory
{
IFoo GetFooByName(string name);
}
public class FooFactory : IFooFactory
{
private readonly IKernel _kernel;
public FooFactory(IKernel kernel)
{
_kernel = kernel;
}
public IFoo GetFooByName(string name)
{
return _kernel.Get<IFoo>(name);
}
}
你也可以像这样添加一个绑定到IKernel:
kernel.Bind<IKernel>().ToConstant(kernel);
内容总结
以上是互联网集市为您收集整理的c# – 使用Ninject基于字符串创建对象全部内容,希望文章能够帮你解决c# – 使用Ninject基于字符串创建对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。