我正在寻找一种最干净的方法来解决autofac的强制依赖问题。
我有一个短暂的类,它将根据LifeTimeScope进行注册:
public class ShortLived
{
public void DoSomethingUsefull() {}
}
我有一个长期存在的类,它将被注册为单实例。它依赖于ShortLived类:
public class LongLived
{
private readonly Func<ShortLived> _getCurrentShortLived;
public LongLived(Func<ShortLived> getCurrentShortLived)
{
_getCurrentShortLived = getCurrentShortLived;
}
public void DoSomethingWithShortLived()
{
var currentShortLived = _getCurrentShortLived();
currentShortLived.DoSomethingUsefull();
}
}
以下尝试不起作用。它抛出一个Autofac.Core.DependencyResolutionException。
public void CaptiveDependencyTest()
{
var builder = new ContainerBuilder();
builder.RegisterType<LongLived>()
.SingleInstance();
var container = builder.Build();
using (var scope = container.BeginLifetimeScope(b => b.RegisterType<ShortLived>()))
{
var longLived = scope.Resolve<LongLived>();
longLived.DoSomethingWithShortLived();
}
}
下面的方法是可行的。但我真的希望有一个更好的解决问题的方法,而不是依赖于某种静态变量。
private static ILifetimeScope currentLifetimeScope;
public void CaptiveDependencyTest2()
{
var builder = new ContainerBuilder();
builder.Register(c =>
{
Func<ShortLived> shortLivedFacotry = () => currentLifetimeScope.Resolve<ShortLived>();
return new LongLived(shortLivedFacotry);
})
.SingleInstance();
var container = builder.Build();
using (var scope = container.BeginLifetimeScope(b => b.RegisterType<ShortLived>()))
{
currentLifetimeScope = scope;
var longLived = scope.Resolve<LongLived>();
longLived.DoSomethingWithShortLived();
}
}
一些背景信息:我正在开发一个OWIN托管的ASP.Net WebApi2微服务。在调用其他服务时,我需要从currentOwinContext.Request.User.Identity中读取值,并将它们添加到我发送给下一个服务的RequestMessage中。我的LongLived类是一个DelegatingHandler (即HttpClient“HttpMessageHandler-Pipeline”的一部分),HttpClient需要是.SingleInstance(),这样我就不必为每个请求实例化新的HttpClients。ShortLived类是IOwinContext,它在Owin管道的LifeTimeScope中注册。
我可以在currentLifeTimeScope中注册HttpConfiguration,而不是为autofac注册静态变量。然后我可以用httpConfig.DependencyResolver.GetRequestLifetimeScope();获得currentLifeTimeScope,我还没有测试过这种方法。我仍然希望能找到更干净的东西。
https://stackoverflow.com/questions/43001786
复制相似问题