dependency-injection - 如何使用 Ninject 在子类中创建实例?

标签 dependency-injection inversion-of-control ninject

我正在学习如何将 nInject 用于我正在开发的新应用程序,并且我创建了以下示例代码,可以将其复制/粘贴到一个简单的控制台应用程序中。它成功返回了一个 IFoo 实例,但我对此有疑问。

我将如何修改代码以使 FooManager 类创建 Foo 对象的实例而不执行“新建”。是否也必须注入(inject)内核?但是如果内核被注入(inject)并且我将行更改为 var foo = _kernel.Get<IFoo>() ,那不是引入服务定位器反模式吗?

namespace IOCTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (IKernel kernel = new StandardKernel(new StandardModule()))
            {
                // do something with the kernal
                var mgr = kernel.Get<IFooManager>();
                var foo = mgr.GetById(1);
            }
        }
    }

    public class StandardModule : Ninject.Modules.NinjectModule
    {
        public override void Load()
        {
            Bind<IDatabase>()
                .To<Database>()
                .InTransientScope();

            Bind<IFooManager>()
                .To<FooManager>()
                .InTransientScope();
        }
    }

    //******************************************************

    public interface IDatabase
    {
        object[] GetScalar(int id);
    }

    public class Database : IDatabase
    {
        public object[] GetScalar(int id)
        {
            return new object[] { "RowName" };
        }
    }

    //******************************************************

    public interface IFooManager
    {
        IFoo GetById(int id);
    }

    public class FooManager : IFooManager
    {
        private IDatabase _db;

        public FooManager(IDatabase db) { _db = db; }

        public IFoo GetById(int id)
        {
            var results = _db.GetScalar(id);
            var foo = new Foo();   // <-- HOW DO I ELIMINATE THIS DEPENDENCY?
            foo.Name = results[0].ToString();
            return foo;
        }
    }

    //******************************************************

    public interface IFoo
    {
        string Name { get; set; }
    }

    public class Foo : IFoo
    {
        public string Name { get; set; }
    }

    //******************************************************
}

最佳答案

首先,您必须考虑 Foo 的用途。这是某种数据容器还是某种服务?

在第一种情况下,您的代码是完美的。数据容器没有依赖关系,不应由 IoC 容器创建。

在第二种情况下阅读 Ninject.Extensions.Factory。

http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

https://github.com/ninject/ninject.extensions.factory/wiki

关于dependency-injection - 如何使用 Ninject 在子类中创建实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091709/

相关文章:

c# - mvc core 2.0,如何通过配置使用 appSettings.json 文件

PHP-DI injectOn 不注入(inject) setter 方法

C# + MongoDB - 不使用 MongoDB 数据类型/属性的 ObjectId

使用 Ninject 在 Azure 上部署 WCF 服务时出现故障

c# - 使用 Ninject 绑定(bind)同一类型的多个版本

c# - MVC 4 Web Api Controller 没有默认构造函数?

javascript - 注入(inject)第一个 Angular Factory

asp.net-mvc-2 - 我的 MVC 自定义 ControllerFactory 可以工作,但还能更好吗?

spring - 停止tomcat时使用spring服务获取java.io.NotSerializableException

c# - MEF:使用 CreationPolicy.NonShared 时将不同的构造函数参数传递给一个部分