gpt4 book ai didi

asp.net-mvc-3 - 在类库中使用 Autofac

转载 作者:行者123 更新时间:2023-12-02 08:48:16 25 4
gpt4 key购买 nike

我正在尝试解决 Autofac IoC 容器的问题。

我的网络应用程序包含以下部分:

  1. 网络应用
  2. 核心(共享)库。
  3. 模块

每个模块都有对核心库(包括以下代码)的引用,并且每个模块都必须能够注册自己的类型。因此我需要在应用程序和模块之间有一个共享容器。

我有以下容器的代码:

public static class DependencyContainer
{
public static IContainer Container { get; private set; }

public static ContainerBuilder Builder { get; private set; }

public static void RegisterType<TFrom, TTo>() where TTo : TFrom
{
Builder.RegisterType<TTo>().As<TFrom>();
}

public static T ResolveType<T>()
{
return Container.Resolve<T>();
}

public static void InitContainer()
{
Builder = new ContainerBuilder();
Container = Builder.Build();
}
}

此容器位于主(核心)库中。当应用程序启动时,它从 global.asax 调用 InitContainer()。在此之后,我尝试使用 RegisterType() 方法从我的应用程序模块中注册一个新类型。

但在此之后我无法解析任何类型。它只是抛出一个异常,指出此类型未注册。

这段代码的主要思想是,我将能够仅使用一个共享容器解析来自任何模块和 Web 应用程序的任何类型。

有人可以帮我解决这个问题吗?在多个库之间使用一个共享 IoC 容器是否有更优雅的架构解决方案?

提前致谢!

最佳答案

您的设计导致 Service Locator anti-pattern .防止在核心库中定义一个容器,让所有人都引用它。使用依赖注入(inject)并在 Composition Root 中配置容器,您的应用程序的启动路径(在您的情况下,组合根将是您的 Web 应用程序的一部分)。

您可以利用 Autofac Module feature , 在composition root中,你可以注册这个模块。

builder.RegisterModule(new CarTransportModule());

但是你也可以将你的模块注册类定义为静态的,这样更简单:

MyApp.SomeModule.SomeModuleBootstrapper.Register(builder);

关于asp.net-mvc-3 - 在类库中使用 Autofac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725646/

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