簡體   English   中英

通用Ninject工廠

[英]Generic Ninject Factory

我正在嘗試創建一個通用工廠,我可以使用Ninject構造函數注入實例化一個類及其依賴項。 它似乎工作得很好,但它並不適合我,我不知道是不是因為它是我第一次使用泛型和IoC容器,但我認為我的方法存在缺陷。 而不是解釋生病只是轉儲我簡單的測試控制台應用程序

Farm.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();
    }
}

Program.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>();
    }
}

任何想法/反饋將不勝感激,謝謝。

我正在嘗試創建一個通用工廠,我可以使用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();
}

如果您的想法是使用通用工廠從應用程序隱藏容器,這意味着應用程序代碼依賴於該靜態工廠。 這是一個很大的禁忌 所有類型都應該圍繞構造函數注入進行設計,注入通用工廠與將內核本身注入類型相同。 這導致代碼難以維護,難以測試且難以驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM