Ich arbeite an einem ASP.NET MVC-Projekt, das externe Plugins unterstützt, jetzt bin ich von Unity zu Autofac und ich muss die Lebensdauer Objekte von Autofac umhüllen, so dass die Plugins nicht müssen referenziere es, in der Einheit könnte ich etwas tun.Autofac Lifetime Management
public sealed class UnityScopeFactory : IDependencyScopeFactory
{
private HttpRequestScope _httpRequest;
private SingletonScope _singleton;
private TransientScope _transient;
public IDependencyScope HttpRequest()
{
return _httpRequest ?? (_httpRequest = new HttpRequestScope());
}
public IDependencyScope Singleton()
{
return _singleton ?? (_singleton = new SingletonScope());
}
public IDependencyScope Transient()
{
return _transient ?? (_transient = new TransientScope());
}
private class HttpRequestScope : IDependencyScope
{
public object CreateScope()
{
return new HttpPerRequestLifetimeManager();
}
}
private class SingletonScope : IDependencyScope
{
public object CreateScope()
{
return new ContainerControlledLifetimeManager();
}
}
private class TransientScope : IDependencyScope
{
public object CreateScope()
{
return new TransientLifetimeManager();
}
}
}
ich ähnliche Sache in Autofac gemacht, aber ich bin mir nicht sicher, ob es der richtige Weg ist zu tun, dass ich in die RegistrationBuilder von Autofac sah, die (leider) interne und ich kam mit dieser.
Auch, nachdem ich dies zur Arbeit gebracht habe, wie kann ich es zum ContainerBuilder übergeben?
In Unity konnte ich so etwas tun.
public sealed class UnityDependencyContainer : IDependencyContainer
{
private readonly IUnityContainer _container;
public UnityDependencyContainer()
{
_container = new UnityContainer()
}
public void Register<TContract, TImplementation>(IDependencyScope scope) where TImplementation : TContract
{
LifetimeManager manager = scope.CreateScope() as LifetimeManager;
if (manager != null)
{
_container.RegisterType<TContract, TImplementation>(manager);
}
}
}
Wie übergebe ich eine Instanz von IComponentLifetime an die Methodenkette? Ist es eine Sackgasse?
public class AutofacContainer : IDependencyContainer
{
private static readonly ContainerBuilder Builder;
static AutofacContainer()
{
Builder = new ContainerBuilder();
}
public void RegisterType<TContract, TImplementation>(IDependencyScope scope) where TImplementation : TContract
{
IComponentLifetime manager = scope.CreateScope() as IComponentLifetime;
if (manager != null)
{
Builder.RegisterType<TImplementation>().As<TContract>();
}
}
}
Wow! Vielen Dank für die Zeit nehmen, wirklich geschätzt. Es ist wirklich PITA, in diesem Stadium zu ändern, dann war ich so begierig, zu Autofac zu wechseln und es auszuprobieren, aber wenn ich es nicht benutzen kann, weil es anders funktioniert, würde ich einen anderen Behälter benutzen oder bleiben müssen, wie die Kosten sind zu groß, um es zu ändern. –
Schöne Erklärung +1! –