Autofac 3.0 avrà un supporto MultitenantIntegration e its preview release is out ora. Per provarlo, ho creato un'applicazione API Web ASP.NET con la seguente configurazione:Contenitore IoC multi-tenant di Autofac in un'applicazione API Web ASP.NET
public class Global : System.Web.HttpApplication {
protected void Application_Start(object sender, EventArgs e) {
var config = GlobalConfiguration.Configuration;
config.Routes.MapHttpRoute("Default", "api/{controller}");
RegisterDependencies(config);
}
public void RegisterDependencies(HttpConfiguration config) {
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// creates a logger instance per tenant
builder.RegisterType<LoggerService>().As<ILoggerService>().InstancePerTenant();
var mtc = new MultitenantContainer(
new RequestParameterTenantIdentificationStrategy("tenant"),
builder.Build());
config.DependencyResolver = new AutofacWebApiDependencyResolver(mtc);
}
}
ottiene il lavoro fatto e crea un'istanza LoggerService
come ILoggerService
per abbonato. Ho due problemi in questa fase, che non ero in grado di risolvere:
- ho usato fuori dalla scatola fornito
RequestParameterTenantIdentificationStrategy
qui come il TenantIdentificationStrategy solo per questa applicazione demo. Sono in grado di creare la mia personalizzata TenantIdentificationStrategy implementando l'interfacciaITenantIdentificationStrategy
. Tuttavia, il metodoTryIdentifyTenant
diITenantIdentificationStrategy
fa affidamento su un'istanza statica comeHttpContext.Current
che è qualcosa che non desidero in un ambiente API Web ASP.NET poiché desidero che la mia API stia ospitando l'agnostico (so che posso delegare questo lavoro al livello di hosting, ma preferirei non farlo). C'è un altro modo per raggiungere questo in un modo che non farò affidamento su un'istanza statica? mi hanno anche la possibilità di registrare un'istanza specifica inquilino come di seguito:
mtc.ConfigureTenant("tenant1", cb => cb.RegisterType<Foo>() .As<IFoo>().InstancePerApiRequest());
Tuttavia, uno dei miei situazioni mi obbliga a passare il nome dell'inquilino attraverso il parametro del costruttore e mi piacerebbe avere qualcosa di simile qui sotto :
mtc.ConfigureTenant((cb, tenantName) => cb.RegisterType<Foo>() .As<IFoo>() .WithParameter("tenantName", tenantName) .InstancePerApiRequest());
Attualmente non esiste una tale API. C'è un altro modo per raggiungere questo o questo tipo di requisito non ha senso?
Grazie Travis. Davvero utile Il tuo ultimo campione è davvero quello che sto cercando. Avrei dovuto pensarci prima :) Quindi, il mio 'ITenantIdentificationStrategy' ha davvero bisogno di un oggetto statico. Quindi non c'è altra opzione per me piuttosto che delegare 'TenantIdentificationStrategy' al livello di hosting che ha il contesto statico per richiesta. – tugberk