【发布时间】:2018-01-24 00:30:14
【问题描述】:
我是使用 Autofac 的新手,所以对于这个菜鸟问题,我深表歉意。 我阅读了 Internet 上的所有手册,解释了使用 Autofac(或任何其他工具,如 Structuremap、Unity 等)时的基础知识。但我发现的所有例子都是基础。我需要知道如何在我的代码中更深入地实现 Autofac。让我试着用这个例子解释一下我需要知道的东西,一个控制台应用程序。
class Program
{
static void Main(string[] args)
{
var container = BuildContainer();
var employeeService = container.Resolve<EmployeeService>();
Employee employee = new Employee
{
EmployeeId = 1,
FirstName = "Peter",
LastName = "Parker",
Designation = "Photographer"
};
employeeService.Print(employee);
}
static IContainer BuildContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<EmployeeRepository>().As<IEmployeeRepository>();
builder.RegisterType<EmployeeService>();
return builder.Build();
}
}
这很简单。我想弄清楚的是,当您深入研究代码时,您如何实现这一点。在这个例子中,当你执行这一行时
employeeService.Print(employee);
让我们假设“打印”方法有点复杂,需要使用另一个依赖项/类来完成他的任务。我们仍在使用 Autofac,所以我想我们需要像上面的示例一样创建依赖项。那是对的吗?在我的“打印”方法中,当我需要使用另一个类时,我必须创建另一个容器,填充它,将它与 Resolve() 一起使用等等?有更简单的方法吗?可以在所有解决方案中使用具有所有所需依赖项的静态类?如何? 我希望清楚。也许我都无法表达我的需要。 :( 对不起我的英语不好。我在学习 Autofac 的同时还在学习它。
【问题讨论】:
-
看起来你已经走上正轨了。你的
EmployeeService需要IEmployeeRepository,所以你注册了它。如果EmployeeService依赖于注入到其构造函数中的其他内容,那么您只需将其注册到同一个容器以及您已经拥有的两个注册。当您解析EmployeeService时,容器将解析它需要的任何内容,即使这些类具有依赖关系,这些类也是如此,等等,只要这些类型都已注册。这就是它如此棒的原因。 -
@NightOwl888 我的问题比这更进一步。我需要知道当你必须在依赖于 Main() 的子进程中创建依赖项时会发生什么。
-
你没有。 DI 容器就是这样做的。您只需使用 autofac 注册它们,它就会一次性解析应用程序的整个对象图。
-
@SebastianGarcia - 我更新了“重复的”答案,使其更清楚它是如何工作的。在您的情况下,您将在
ApplicationLogic构造函数中接受EmployeeService,并将Employee的创建和对employeeService.Print(employee)的调用移至ApplicationLogic.Run()方法。当然,注入接口而不是具体类型(如下面的答案中所指出的)也是很好的建议。 -
@NightOwl888 谢谢。现在您指出我的解决方案更加清晰,我可以更好地理解它。再次感谢!
标签: c# dependency-injection inversion-of-control autofac