我正在尝试创建一个通用工厂,我可以调用它来使用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>();
}
}
非常感谢任何想法/反馈,谢谢。
答案 0 :(得分:2)
我试图创建一个可以调用实例化a的通用工厂 使用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。