Autofac multitenant用法

Autofac multitenant用法

什么是Multitenant?

官方说法:「A multitenant application is an application that you can deploy one time yet allow separate customers, or “tenants,” to view the application as though it was their own.」。也就是依不同的使用者,作不同的回应或逻辑处理,算是个Strategy pattern。

其实这样的功能,在没有Multitenant 的情况下,也是可以透过builder 在注册物件时,用Keyed 来实作。例如底下范例。

var builder = new ContainerBuilder();

builder.RegisterType<StudentA>().Keyed<IStudent>("A");

而在要resolve 物件时,只要使用ResolveKeyed 然后再传入service name 就可回传正确认物件。

var _container = builder.Build();

var b = _container.ResolveKeyed<IStudent>("A");

但个人觉得,用 Keyed 来实作时会有二个问题。

一、如果范围很大的话,这样 Keyed 到底要用到多少次?

二、如果本来就需要用到 Keyed 功能,如果再加上多实作multitenant,只会更加混混乱。

所以,multitenant 在处理较依不同情境作不同回应及逻辑处理时就相对实用。

举例来说,有个学校内部的系统发布后,依不同群组的学生,在整个站台内执行不同的金额计算。底下即说明如何实作。

在实作前,nuget 除了要装autofac 外,还要再加装multitenant 套件。

using Autofac;

using Autofac.Multitenant;

自己要新建一个实作「ITenantIdentificationStrategy」介面的类别。

介面内的「TryIdentifyTenant」逻辑要如何实作,就看各种情况了。但简单点的话,其实就只是记个id 而已。

class TenantIdentificationStrategy : ITenantIdentificationStrategy

    {

        public object CurrentTenantId { get; set; }

        public bool TryIdentifyTenant(out object tenantId)

        {

            if (this.CurrentTenantId.ToString() == "0")

            {

                // 0 is the "default tenant ID"

                tenantId = null;

            }

            else

            {

                // If the current tenant isn't default, return the actual ID.

                tenantId = this.CurrentTenantId;

            }

            return true;

        }

    }

再来是实作multitenant 的内容。

var builder = new ContainerBuilder();

builder.RegisterType<StudentA>().As<IStudent>();

var _container = builder.Build();

var _multitenant = new TenantIdentificationStrategy() { CurrentTenantId = "A" };

var multi = new MultitenantContainer(_multitenant, _container);

multi.ConfigureTenant("A", x =>

{

   x.RegisterType<TaxA>().As<ITax>();

});

multi.ConfigureTenant("B", x =>

{

   x.RegisterType<TaxB>().As<ITax>();

   //即使外面的 builder 有註冊,在 tenant 仍可覆寫註冊

   x.RegisterType<StudentB>().As<IStudent>();

});



Console.WriteLine(multi.Resolve<ITax>().Calculate());

Console.WriteLine(multi.Resolve<IStudent>().GetName());



_multitenant.CurrentTenantId = "B";

Console.WriteLine(multi.Resolve<ITax>().Calculate());

Console.WriteLine(multi.Resolve<IStudent>().GetName());

首先,先new 一个刚才实作的类别,然后再当成参数用来new MultitenantContainer 这个类别。

var _multitenant = new TenantIdentificationStrategy() { CurrentTenantId = "A" };

var multi = new MultitenantContainer(_multitenant, _container);

再来就是设定tenant,主要参数就是给一个id,然后在这个id 内要为各个interface 注册哪些物件。

以下面程式来说,我建了「A」跟「B」二种tenant,意思也就是之后可用不同的id 来作切换,「multi」这个物件就会依对应到的tenant 来resolve 不同的物件。

multi.ConfigureTenant("A", x =>

{

   x.RegisterType<TaxA>().As<ITax>();

});

multi.ConfigureTenant("B", x =>

{

   x.RegisterType<TaxB>().As<ITax>();

   //即使外面的 builder 有註冊,在 tenant 仍可覆寫註冊

   x.RegisterType<StudentB>().As<IStudent>();

});

在程式中,可随时切换不同的id,用以切换使用不同的tenant。

_multitenant.CurrentTenantId = "B";

Console.WriteLine(multi.Resolve<IStudent>().GetName());

如果是要resolve 相同的物件,不会因为不同的tenant 而有区分的话,则可以在builder 内即注册,这样只要在tenant 没有被覆写,所resolve 出来的物件都会一样。

var builder = new ContainerBuilder();

builder.RegisterType<StudentA>().As<IStudent>();

心得:

个人觉得能用在站台有因为不同群组的使用者,而需执行不同的逻辑。因为一整个站台的功能很多,如果能透过这样切换tenant,这样只要在初始的builder 都设定好,各个功能就能一次切换了。
原文来自:点部落-36亿的程式之路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AutoFac 是一个 .NET 中常用的依赖注入容器,可以帮助我们实现松耦合的编程和易于测试的代码。下面是一个简单的 AutoFac 使用教程。 1. 首先,你需要在项目中安装 AutoFac 包。你可以通过 NuGet 包管理器来安装 AutoFac。使用以下命令来安装: ``` Install-Package Autofac ``` 2. 创建一个类,该类将成为你的依赖注入配置类。在配置类中,你需要注册你想要注入的类型和它们的实现。 ```csharp using Autofac; public class DependencyConfig { public static IContainer Configure() { var builder = new ContainerBuilder(); // 注册你的依赖关系 builder.RegisterType<MyService>().As<IMyService>(); // 注册其他依赖关系... return builder.Build(); } } ``` 在上面的代码中,我们注册了一个 `MyService` 类型,并将其作为 `IMyService` 接口的实现。 3. 在你的应用程序的入口处,使用下面的代码来创建一个容器和解析依赖关系: ```csharp var container = DependencyConfig.Configure(); // 创建容器 var myService = container.Resolve<IMyService>(); // 解析依赖关系 // 使用 myService 对象进行操作 ``` 在上面的代码中,我们使用 `DependencyConfig.Configure()` 方法创建了一个容器,并通过 `container.Resolve<>` 方法解析了我们注册的 `IMyService` 接口的实现。 4. 现在,你可以在你的应用程序中使用注入的依赖关系。当需要使用某个依赖时,只需将它声明为一个构造函数参数即可。 ```csharp public class MyClass { private readonly IMyService _myService; public MyClass(IMyService myService) { _myService = myService; } // 使用 _myService 对象进行操作 } ``` 在上面的代码中,我们在 `MyClass` 类的构造函数中声明了一个 `IMyService` 类型的参数,AutoFac 将自动解析并注入 `IMyService` 的实现。 这就是 AutoFac 的简单使用教程。你可以根据你的项目需求和设计模式合理地注册和使用依赖关系。希望能对你有所帮助!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值