3

我想創建一個通用工廠,我可以調用實例化一個類和它的依賴使用Ninject構造函數注入。它似乎工作得很好,但它沒有和我一起坐好,我不知道是否因爲它第一次使用泛型和IoC容器,但我認爲我的方法有缺陷。而不是解釋生病只是轉儲我簡單的測試控制檯應用程序。通用Ninject工廠

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

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

+4

基本上是[service locator anti-pattern](http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx)。可能這就是爲什麼它感覺很奇怪。 –

+0

對我來說看起來很好......如果你切換到自動構造函數依賴注入,那麼這就是它的樣子。你認爲什麼是「有缺陷的」? –

+0

舉個更多的例子,你在哪裏使用Factory? –

回答

1

我試圖創建一個通用的工廠我可以調用使用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(); 
} 

如果你的想法是使用你的通用工廠隱藏應用程序的容器,這意味着應用程序代碼取決於靜態工廠。這是一個big no-no。所有類型都應該圍繞構造函數注入進行設計,注入一個通用工廠與將內核本身注入類型相同。這導致代碼難以維護,難以測試,並且很難成爲verified

+0

這是一個很好的觀點。我試圖避免在整個應用程序中使用內核,但我只是重新創建相同的問題。我之前使用IoC的經驗是使用Ninject的mvc擴展,這提高了直接調用內核的需求。我想我會跟可憐的人DI(Bastard Injection)一起去,直到我完全明白我在做什麼爲止,一旦我理解了它,將容易實現一個容器與修復破壞的實現相比。 –