访问或获取静态类中的 Autofac Container

2024-01-08

我需要在静态类中获取或访问我的 IoC 容器。这是我的(简化的)场景:

我在 Startup 类中注册 ASP .net Web Api 的依赖项(而且我也为 MVC 或 WCF 执行此操作。我有一个 DependecyResolver 项目,但为了简单起见,请考虑以下代码)

// Web Api project - Startup.cs
public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    var builder = new ContainerBuilder();

    // ... Omited for clarity
    builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
        .AsClosedTypesOf(typeof(IHandle<>))
        .AsImplementedInterfaces();

    // ...
    IContainer container = builder.Build();
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    // ...
}

然后,在一个单独的类库中,我有我的静态类(为了清楚起见再次简化):

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

    static DomainEvents()
    {
        //Container = I need get my Autofac container here
    }

    public static void Register<T>(Action<T> callback) where T : IDomainEvent { /* ... */ }

    public static void ClearCallbacks() { /* ... */  }

    public static void Raise<T>(T args) where T : IDomainEvent
    {
        foreach (var handler in Container.Resolve<IEnumerable<IHandle<T>>>())
        {
            handler.Handle(args);
        }
        // ...
    }
}

知道我怎样才能得到这个吗?


我需要在静态类中获取或访问我的 IoC 容器。 知道我怎样才能得到这个吗?

是的,你不知道!严重地。带有静态的图案DomainEventsclass 源自 Udi Dahan,但连 Udi 也承认这是一个糟糕的设计。需要自己的依赖关系的静态类使用起来非常痛苦。它们使系统难以测试和维护。

相反,创建一个IDomainEvents抽象并将该抽象的实现注入到需要发布事件的类中。这完全解决了你的问题。

您可以定义您的DomainEvents类如下:

public interface IDomainEvents
{
    void Raise<T>(T args) where T : IDomainEvent;
}

// NOTE: DomainEvents depends on Autofac and should therefore be placed INSIDE
// your Composition Root.
private class AutofacDomainEvents : IDomainEvents
{
    private readonly IComponentContext context;
    public AutofacDomainEvents(IComponentContext context) {
        if (context == null) throw new ArgumentNullException("context");
        this.context = context;
    }

    public void Raise<T>(T args) where T : IDomainEvent {
        var handlers = this.context.Resolve<IEnumerable<IHandle<T>>>();
        foreach (var handler in handlers) {
            handler.Handle(args);
        }
    }
}

您可以按如下方式注册此类:

IContainer container = null;

var builder = new ContainerBuilder();

builder.RegisterType<AutofacDomainEvents>().As<IDomainEvent>()
    .InstancePerLifetimeScope();

// Other registrations here

container = builder.Build();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问或获取静态类中的 Autofac Container 的相关文章

随机推荐

  • 为什么 WmiPrvSE.exe 持有我的进程作业对象的句柄?

    我有一个 NET 应用程序 它生成多个子 工作进程 我使用 Windows 作业对象 API 和 JOB OBJECT LIMIT KILL ON JOB CLOSE 设置来确保在父进程终止时子进程始终被终止 但是 我观察到在父进程关闭后
  • Docker 容器发布的端口无法访问?

    所以情况是这样的 我有一个使用这个 dockerfile 构建的容器正在运行 FROM python 2 onbuild EXPOSE 8888 CMD nohup mock server dir usr src app 我用这个命令运行它
  • origin/branch_name 和branch_name 之间的区别?

    用于推送到位桶 如果我做 git push origin origin branch name我的提交没有被推送 Total 0 delta 0 reused 0 delta 0 If I do git push origin branch
  • 如何将页面加载到页面中间(而不是顶部)?

    我希望页面在页面中间的某个 div 处打开 而不是在顶部 我有类似的东西 div div div div div div 如何让页面在 d4 而不是顶部打开 除了在 URL 末尾添加 d4 我想一定有一些简单的方法可以做到这一点 但我不知道
  • 如何在 Xamarin.Forms 的 MainPage 上创建动态按钮列表?

    我正在创建一个应用程序来扫描条形码门票 当您启动应用程序时 屏幕上必须显示可用节目的列表 为了获取所有可用的节目 我正在使用一个网络服务 它会返回一个List
  • 使用临时数组作为左值

    这个程序的格式不正确 struct X int i int main X i 1 i 临时的子对象X 不能用作左值 因为X 是一个右值 然而 这会用 GCC 5 2 1 进行静默编译 并且 Wall using Y int 10 int m
  • 替换 Markdown 文本中的占位符(变量)的最简单方法?

    我需要一种开放格式来以通用方式 使用占位符 变量 编写故事 为了使故事具体化 我想设置一个键 值对列表并在发布时应用它们 我还想将样式与内容分开 这样我就可以轻松发布到网络 pdf 等 例子 varname is a great place
  • 从大文件中查找唯一值

    我有一个大文件 比如 10 TB 其中包含 MD5 哈希流 其中包含重复项 我的内存为 10MB 非常有限 硬盘空间不受限制 使用给定条件查找所有唯一的哈希值 消除重复项 请帮忙 这显然不是一个家庭作业问题 您可以使用外部排序算法 例如使用
  • 如何过滤 Room 中的嵌套关​​系?

    让我们举个例子 我有一个表格 其中有几个部分 每个部分都有问题 侧面 我有映射到问题的答案 并且它们还有我想在查询时过滤的另一列 所以我有以下实体 Entity tableName sections public class Section
  • Qt宏关键字导致名称冲突

    我正在为我的 Qt 项目构建 NCurses 界面 我想使用 CDK 但我认为signals该结构的成员与 Qt 发生冲突signals关键词 usr include linux cdk h 411 error expected unqua
  • SQL - 如果行数大于则插入

    我创建了一个 SQL 查询 该查询将从 Oracle 链接服务器返回行 例如 该查询工作正常 将返回 40 行 我希望仅当返回的行数大于 40 时才将结果插入到表中 我的想法是 我可以创建一个触发器来发送一封电子邮件 告知该号码已被泄露 D
  • 从 C# 调用包含函数指针的 DLL 函数

    我有一个用 C 编写的 DLL 其中包含导出函数 该函数具有用作回调函数的函数指针 C DllExport unsigned int DllFunctionPointer unsigned int i unsigned int TimesT
  • Phantomjs Function.prototype.bind

    对我知道那个 Phantomjs 不支持函数绑定 但也许我可以用别的东西 或者说page open不使用bind 看起来还可以 但是有些网站 返回错误 TypeError undefined is not a function evalua
  • Windows 上的 Python - 如何等待多个子进程?

    如何在 Windows 上的 Python 中等待多个子进程 而不需要主动等待 轮询 像这样的东西almost对我有用 proc1 subprocess Popen python mytest py proc2 subprocess Pop
  • 如何获取传递给函数的变量的原始变量名[重复]

    这个问题在这里已经有答案了 是否可以获取传递给函数的变量的原始变量名 例如 foobar foo def func var print var origname So that func foobar Returns gt gt fooba
  • 警报管理器 2 次

    我有一个BroadcastReceiver called AlarmReceiver that Toasts 警报工作了 我正在尝试设置重复PendingIntent引起AlarmReceiver5 45 和 17 30 但在启动应用程序几
  • grails:如何更改编译的 GSP(gsp*.class 文件)?

    我在 weblogic 中使用 grails 需要更改展开的部署文件夹中的类文件 但这个类实际上是一个gsp编译的文件 那么 问题是 GSP 文件 class 在战争中留在哪里 注意 我正在使用外部 GSP 设置grails gsp vie
  • Google 图表 API JSON 无效

    以下代码返回 Google 图表的 json public static DataTable generateDataTable Create a data table DataTable data new DataTable ArrayL
  • 使用本地化日期进行 Django 查询

    在我的表单中 我有一个名为 booking date 的 DateField 它是使用 AdminDateWidget 呈现的 booking date字段的内容需要国际化 当我想像这样使用字段的值时 就会出现问题 booking Book
  • 访问或获取静态类中的 Autofac Container

    我需要在静态类中获取或访问我的 IoC 容器 这是我的 简化的 场景 我在 Startup 类中注册 ASP net Web Api 的依赖项 而且我也为 MVC 或 WCF 执行此操作 我有一个 DependecyResolver 项目