Dada la descripción de su caso de uso, diría que tiene algunas opciones.
Primero, puede hacer que cada aplicación registre su propio conjunto de dependencias incluyendo el alcance de por vida. Tener una o dos piezas de código "duplicadas" a este respecto no es tan importante teniendo en cuenta las diferencias entre la aplicación y el hecho de que los registros parecen bastante pequeños.
En segundo lugar, podría envolver la parte común (menos el alcance de por vida) en un método de extensión ContainerBuilder que podría utilizarse en cada aplicación. Todavía significaría que cada aplicación tiene un pequeño "código duplicado", pero la lógica común estaría envuelta en una simple extensión.
public static IRegistrationBuilder<TLimit, ScanningActivatorData, DynamicRegistrationStyle>
RegisterConnection<TLimit, ScanningActivatorData, DynamicRegistrationStyle>(this ContainerBuilder builder)
{
// Put the common logic here:
builder.Register(...).AsImplementedInterfaces();
}
El consumo de una extensión tal en cada aplicación se vería así:
builder.RegisterConnection().InstancePerHttpRequest();
// or
builder.RegisterConnection().InstancePerLifetimeScope();
Por último, si usted sabe que es ya sea web o no en la web, usted podría hacer un módulo personalizado que controla el interruptor :
public class ConnectionModule : Autofac.Module
{
bool _isWeb;
public ConnectionModule(bool isWeb)
{
this._isWeb = isWeb;
}
protected override void Load(ContainerBuilder builder)
{
var reg = builder.Register(...).AsImplementedInterfaces();
if(this._isWeb)
{
reg.InstancePerHttpRequest();
}
else
{
reg.InstancePerLifetimeScope();
}
}
}
En cada aplicación, usted podría entonces registrar el módulo:
// Web application:
builder.RegisterModule(new ConnectionModule(true));
// Non-web application:
builder.RegisterModule(new ConnectionModule(false));
O bien, mencionaste que el alcance de tu vida en tus otras aplicaciones tiene un nombre.usted podría hacer su módulo de tomar el nombre:
public class ConnectionModule : Autofac.Module
{
object _scopeTag;
public ConnectionModule(object scopeTag)
{
this._scopeTag = scopeTag;
}
protected override void Load(ContainerBuilder builder)
{
var reg = builder.Register(...)
.AsImplementedInterfaces()
.InstancePerMatchingLifetimeScope(this._scopeTag);
}
}
El consumo es similar:
// Web application (using the standard tag normally provided):
builder.RegisterModule(new ConnectionModule("httpRequest"));
// Non-web application (using your custom scope name):
builder.RegisterModule(new ConnectionModule("yourOtherScopeName"));
recomendaría contra el simple uso de InstancePerLifetimeScope
en una aplicación web a menos que en realidad es lo que se propone. Como se menciona en otras respuestas/comentarios, InstancePerHttpRequest
usa un alcance específico de por vida con nombre para que sea seguro crear ámbitos de vida para niños; usar InstancePerLifetimeScope
no tiene tal restricción así que realmente obtendrá una conexión por alcance de hijo en lugar de una conexión para la solicitud. Yo, personalmente, no asumo que otros desarrolladores no harán uso de los alcances de la vida del niño (which is a recommended practice), entonces en mis aplicaciones soy muy específico. Si tiene el control total de su aplicación y puede asegurar que no está creando ámbitos secundarios adicionales o que realmente desea una conexión por alcance, entonces quizás InstancePerLifetimeScope
resolverá su problema.
¿Tiene vidas útiles específicas en mente para las conexiones? Si es así, ¿son diferentes las duraciones de cada aplicación o es siempre la misma independientemente del tipo de aplicación? ¿Qué hay de la puesta en común? ¿Se agrupa en algunas aplicaciones, pero no en otras? –
Es como usted dijo "Las extensiones MVC usan un alcance designado para lograr el mecanismo de una vez por solicitud". El alcance nombrado Http no está allí cuando utiliza el módulo en la aplicación de la consola. Actualmente estoy viendo cuál será la unidad de trabajo y que estará encapsulada en un alcance. –