Ejemplo n.º 1
0
        /// <summary>
        /// Build the container.
        /// </summary>
        public static void BuildContainer()
        {
            var tenantIdStrategy = new RequestParameterTenantIdentificationStrategy("tenant");

            var builder = new ContainerBuilder();

            builder.RegisterType <FacebookController>();
            builder.RegisterType <TwitterController>();
            builder.RegisterInstance(tenantIdStrategy).As <ITenantIdentificationStrategy>();

            var mtc = new MultitenantContainer(tenantIdStrategy, builder.Build());

            mtc.ConfigureTenant("1",
                                b =>
            {
                b.RegisterType <FacebookAuthentication>().As <IAuthentication>().InstancePerDependency();
                b.RegisterType <FacebookController>().As <IController>();
            });
            mtc.ConfigureTenant("2",
                                b =>
            {
                b.RegisterType <TwitterAuthentication>().As <IAuthentication>().SingleInstance();
                b.RegisterType <TwitterController>().As <IController>();
            });

            DependencyResolver.SetResolver(new AutofacDependencyResolver(mtc));
        }
        public void TryIdentifyTenant_NoHttpContext()
        {
            var    strategy = new RequestParameterTenantIdentificationStrategy("foo");
            object id;
            bool   success = strategy.TryIdentifyTenant(out id);

            Assert.IsFalse(success, "Without a context, the tenant should not have been identified.");
        }
        public void When_Call_Index_Action_Should_Return_Valid_Model()
        {
            var expected = new Models.LoginModel()
            {
                Email    = "*****@*****.**",
                Password = "******",
                Source   = "Facebook"
            };
            var service          = new FacebookAuthentication();
            var tenantIdStrategy = new RequestParameterTenantIdentificationStrategy("tenant");
            var controller       = new FacebookController(service, tenantIdStrategy);
            var actionResult     = controller.Index();
            var viewResult       = actionResult as ViewResult;
            var actual           = viewResult.ViewData.Model as Models.LoginModel;

            Assert.AreEqual(expected.Email, actual.Email);
            Assert.AreEqual(expected.Password, actual.Password);
            Assert.AreEqual(expected.Source, actual.Source);
        }
        public void Ctor_StoresParameterName()
        {
            var strategy = new RequestParameterTenantIdentificationStrategy("foo");

            Assert.AreEqual("foo", strategy.ParameterName, "The parameter name was not stored.");
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Handles the global application startup event.
        /// </summary>
        protected void Application_Start()
        {
            // Create the tenant ID strategy. Required for multitenant integration.
            var tenantIdStrategy = new RequestParameterTenantIdentificationStrategy("tenant");

            // Register application-level dependencies and controllers. Note that
            // we are manually registering controllers rather than all at the same
            // time because some of the controllers in this sample application
            // are for specific tenants.
            var builder = new ContainerBuilder();

            builder.RegisterType <HomeController>();
            builder.RegisterType <BaseDependency>().As <IDependency>();

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

            // The service client is not different per tenant because
            // the service itself is multitenant - one client for all
            // the tenants and the service implementation switches.
            builder.Register(c => new ChannelFactory <IMultitenantService>(new BasicHttpBinding(), new EndpointAddress("http://localhost:63578/MultitenantService.svc"))).SingleInstance();
            builder.Register(c => new ChannelFactory <IMetadataConsumer>(new WSHttpBinding(), new EndpointAddress("http://localhost:63578/MetadataConsumer.svc"))).SingleInstance();

            // Register an endpoint behavior on the client channel factory that
            // will propagate the tenant ID across the wire in a message header.
            // On the service side, you'll need to read the header from incoming
            // message headers to reconstitute the incoming tenant ID.
            builder.Register(c =>
            {
                var factory      = c.Resolve <ChannelFactory <IMultitenantService> >();
                factory.Opening += (sender, args) => factory.Endpoint.Behaviors.Add(new TenantPropagationBehavior <string>(tenantIdStrategy));
                return(factory.CreateChannel());
            }).InstancePerHttpRequest();
            builder.Register(c =>
            {
                var factory      = c.Resolve <ChannelFactory <IMetadataConsumer> >();
                factory.Opening += (sender, args) => factory.Endpoint.Behaviors.Add(new TenantPropagationBehavior <string>(tenantIdStrategy));
                return(factory.CreateChannel());
            }).InstancePerHttpRequest();

            // 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 request
            // context. To use strongly-typed tenant IDs, create a custom tenant
            // identification strategy that returns the appropriate type.

            // Configure overrides for tenant 1 - dependencies, controllers, etc.
            mtc.ConfigureTenant("1",
                                b =>
            {
                b.RegisterType <Tenant1Dependency>().As <IDependency>().InstancePerDependency();
                b.RegisterType <Tenant1Controller>().As <HomeController>();
            });

            // Configure overrides for tenant 2 - dependencies, controllers, etc.
            mtc.ConfigureTenant("2",
                                b =>
            {
                b.RegisterType <Tenant2Dependency>().As <IDependency>().SingleInstance();
                b.RegisterType <Tenant2Controller>().As <HomeController>();
            });

            // 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());

            // Create the dependency resolver using the
            // multitenant container instead of the application container.
            DependencyResolver.SetResolver(new AutofacDependencyResolver(mtc));

            // Perform the standard MVC setup requirements.
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);
        }