gpt4 book ai didi

c# - 通用注入(inject)工厂

转载 作者:行者123 更新时间:2023-11-30 17:09:35 24 4
gpt4 key购买 nike

我正在尝试创建一个通用工厂,我可以调用它来使用 Ninject 构造函数注入(inject)来实例化一个类及其依赖项。它似乎工作得很好,但它不太适合我,我不知道那是不是因为它是我第一次使用泛型和 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>();
}
}

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

最佳答案

I'm trying to create a generic factory I can call to instantiate a class and its dependencies using Ninject constructor injection

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 .所有类型都应该围绕构造函数注入(inject)进行设计,注入(inject)通用工厂与将内核本身注入(inject)到一个类型中是一样的。这导致代码难以维护、难以测试和难以成为 verified .

关于c# - 通用注入(inject)工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12843328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com