public void TryIdentifyTenant_NoOperationContext()
        {
            var    strategy = new OperationContextTenantIdentificationStrategy();
            object tenantId;
            bool   success = strategy.TryIdentifyTenant(out tenantId);

            Assert.False(success);
        }
        public void TryIdentifyTenant_NoOperationContext()
        {
            var    strategy = new OperationContextTenantIdentificationStrategy();
            object tenantId;
            bool   success = strategy.TryIdentifyTenant(out tenantId);

            Assert.IsFalse(success, "The tenant should not be identified if there is no operation context.");
        }
コード例 #3
0
ファイル: Global.asax.cs プロジェクト: zxy050/Autofac
        /// <summary>
        /// Handles the global application startup event.
        /// </summary>
        protected void Application_Start(object sender, EventArgs e)
        {
            // Create the tenant ID strategy. Required for multitenant integration.
            var tenantIdStrategy = new OperationContextTenantIdentificationStrategy();

            // Register application-level dependencies and service implementations.
            // Note that we are registering the services as the interface type
            // because the .svc files refer to the interfaces. We could potentially
            // use named service types as well.
            var builder = new ContainerBuilder();

            builder.RegisterType <BaseImplementation>().As <IMultitenantService>();
            builder.RegisterType <BaseImplementation>().As <IMetadataConsumer>();
            builder.RegisterType <BaseDependency>().As <IDependency>();

            // Adding the tenant ID strategy into the container so services
            // can return output about the current tenant.
            builder.RegisterInstance(tenantIdStrategy).As <ITenantIdentificationStrategy>();

            // Create the multitenant container based on the application
            // defaults - here's where the multitenant bits truly come into play.
            var mtc = new MultitenantContainer(tenantIdStrategy, builder.Build());

            // Notice we configure tenant IDs as strings below because the tenant
            // identification strategy retrieves string values from the message
            // headers.

            // Configure overrides for tenant 1 - dependencies, service implementations, etc.
            mtc.ConfigureTenant("1",
                                b =>
            {
                b.RegisterType <Tenant1Dependency>().As <IDependency>().InstancePerDependency();
                b.RegisterType <Tenant1Implementation>().As <IMultitenantService>();
                b.RegisterType <Tenant1Implementation>().As <IMetadataConsumer>();
            });

            // Configure overrides for tenant 2 - dependencies, service implementations, etc.
            mtc.ConfigureTenant("2",
                                b =>
            {
                b.RegisterType <Tenant2Dependency>().As <IDependency>().SingleInstance();
                b.RegisterType <Tenant2Implementation>().As <IMultitenantService>();
                b.RegisterType <Tenant2Implementation>().As <IMetadataConsumer>();
            });

            // Configure overrides for the default tenant. That means the default
            // tenant will have some different dependencies than other unconfigured
            // tenants.
            mtc.ConfigureTenant(null, b => b.RegisterType <DefaultTenantDependency>().As <IDependency>().SingleInstance());

            // Multitenant service hosting requires use of a different service implementation
            // data provider that will allow you to define a metadata buddy class that isn't
            // tenant-specific.
            AutofacHostFactory.ServiceImplementationDataProvider = new MultitenantServiceImplementationDataProvider();

            // Add a behavior to service hosts that get created so incoming messages
            // get inspected and the tenant ID can be parsed from message headers.
            // For multitenancy to work, you need to know for which tenant a
            // given request is being made. In this case, the incoming message headers
            // expect to see a string for the tenant ID; if your tenant ID coming
            // from clients is different, change that here.
            AutofacHostFactory.HostConfigurationAction =
                host =>
                host.Opening += (s, args) =>
                                host.Description.Behaviors.Add(new TenantPropagationBehavior <string>(tenantIdStrategy));

            // Finally, set the host factory application container on the multitenant
            // WCF host to a multitenant container. This is similar to standard
            // Autofac WCF integration.
            AutofacHostFactory.Container = mtc;

            // Note that the .svc file for your service needs to use the
            // Autofac.Extras.Multitenant.Wcf.AutofacServiceHostFactory or
            // Autofac.Extras.Multitenant.Wcf.AutofacWebServiceHostFactory rather
            // than the standard Autofac host factories.
        }