gpt4 book ai didi

c# - 在静态类中访问或获取 Autofac 容器

转载 作者:太空狗 更新时间:2023-10-30 00:04:42 26 4
gpt4 key购买 nike

我需要在静态类中获取或访问我的 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);
}
// ...
}
}

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

最佳答案

I need to get or access to my IoC container in a static class. Any idea how can I get this?

是的,你没有!严重地。带有静态DomainEvents 类的模式起源于Udi Dahan,但即使是Udi 也承认这是一个糟糕的设计。需要自身依赖的静态类使用起来非常痛苦。它们使系统难以测试和维护。

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

您可以按如下方式定义您的 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();

关于c# - 在静态类中访问或获取 Autofac 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33955182/

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