ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 使用Ninject基于字符串创建对象

2019-06-12 03:03:03  阅读:126  来源: 互联网

标签:c dependency-injection ninject


我需要根据从数据库中获取的字符串创建共享公共接口(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,dependency-injection,ninject
来源: https://codeday.me/bug/20190612/1222988.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有