3

我正在尝试创建一个通用工厂,我可以调用它来使用 Ninject 构造函数注入来实例化一个类及其依赖项。它似乎工作得很好,但它并不适合我,我不知道这是不是因为它是我第一次使用泛型和 IoC 容器,但我认为我的方法有缺陷。而不是解释生病只是转储我的简单测试控制台应用程序。

农场.cs

class Farm
{
    private readonly IAnimal _animal;
    private readonly IVehicle _vehicle;

    public Farm(IAnimal animal, IVehicle vehicle)
    {
        _animal = animal;
        _vehicle = vehicle;
    }

    public void Listen()
    {
        _animal.Speak();
        _vehicle.Run();
    }
}

程序.cs

class Program
{
    static void Main(string[] args)
    {
        var farm = new NinjectFactory<Farm>().GetInstance();

        farm.Listen();

        Console.Read();
    }
}

NinjectFactory.cs

class NinjectFactory<T>
{
    public T GetInstance()
    {
        var kernel = new StandardKernel(new IoCModule());

        return kernel.Get<T>();
    }
}

NinjectModule.cs

class IoCModule : NinjectModule 
{
    public override void Load()
    {
        Bind<IAnimal>().To<Dog>();
        Bind<IVehicle>().To<Tractor>();
    }
}

任何想法/反馈将不胜感激,谢谢。

4

1 回答 1

2

我正在尝试创建一个通用工厂,我可以调用它来使用 Ninject 构造函数注入来实例化一个类及其依赖项

Ninject Kernel(或任何容器)是一个通用工厂。您将通用工厂隐藏在通用工厂后面。你可以简单地这样做:

private static StandardKernel kernel;

static void Main(string[] args)
{
    Bootstrap();

    // Resolve the application's root type
    // by using the container directly.
    var farm = kernel.Get<Farm>();

    // Operate on the root type
    farm.Listen();

    Console.Read();
}

private static Kernel Bootstrap()
{
    kernel = new StandardKernel();

    kernel.Bind<IAnimal>().To<Dog>();
    kernel.Bind<IVehicle>().To<Tractor>();
    kernel.Bind<Farm>().ToSelf();
}

如果您的想法是使用通用工厂对应用程序隐藏容器,这意味着应用程序代码依赖于该静态工厂。这是一个很大的禁忌。所有类型都应该围绕构造函数注入进行设计,注入泛型工厂与将内核本身注入类型相同。这导致代码难以维护、难以测试和难以验证

于 2012-10-11T21:33:15.633 回答