如何扩展多客户系统以处理多个相同的"控制器

时间:2014-08-20 11:11:01

标签: c# asp.net-web-api inversion-of-control scalability controllers

事实:
我在申请时使用了webapi 我的应用程序是一个多客户应用程序 我的大多数业务逻辑都是相同的,但我确实在一些客户之间存在一些差异 我在这里给出的例子是一个基本的“登录”示例。我的系统中有一些更关键的地方,我需要一个额外的控制器(我知道我可以使用这个简单的登录控制器执行多种解决方法)。

假设我有一个看起来像这样的登录控制器:

public class LoginController
{
   public LoginResponse Post(LoginRequest request)
   {
      // call ICustomer service to authenticate and return a response
   }
}

现在我将IOC用于我的服务。因此,每个客户通常可以使用不同的服务并进行不同的身份验证,但是当我需要将不同的数据返回给客户端时(每个客户)会发生什么?

我可以使用ILoginResponse& ILoginRequest并使用IOC实现此目的,但我仍想添加另一个LoginController(具有相同的名称,以便我的客户端将调用api\Login)并获得另一个抽象级别。

所以我的下一个想法是保持相同的控制器名称,并将每个客户控制器分成不同的DLL。

所以我会有这样的事情:

CommonControllers.dll
Customer1Controllers.dll
Customer2Controllers.dll

但我怎么能在这里进行映射呢?

我的界面看起来像是:

public interface ILoginControllerInterface<S,T>
{
   S Post(T model);
}

看似如下的实现:

CommonControllers.dll

public class LoginController : ILoginControllerInterface<LoginResponse,LoginRequest>
{
   public LoginResponse Post(LoginRequest request)
   {
      // call ICustomer service to authenticate and return a response
   }
}

Customer1Controllers.dll

public class LoginController : ILoginControllerInterface<LoginCusomterResponse,LoginCustomerRequest>
{
   public LoginCusomterResponse Post(LoginCustomerRequest request)
   {
      // call ICustomer service to authenticate and return a response
   }
}

但是如何告诉解析器解析“正确”的LoginController?
我正在使用Unity作为我的IOC容器,我的服务是通过配置注册的 我想要一个注册我的控制器的地方。

我使用自己的解析器重写了默认的web-api解析器:

GlobalConfiguration.Configuration.DependencyResolver = resolver;

我正在使用我的客户决心来解决我的应用程序中的所有内容。 我使用控制器工厂。由于我的解析器解析了我的控制器并为我执行了DI。

底线:
如果我收到api/login的请求,我该如何解决正确的控制器? 让我们说对于customer1我想获得Customer1Controller.dll版本而对于customer2我想获得CommonControllers.dll。
我希望这是通过配置,所以我可以获得灵活性。

顺便说一句:
如果有更好的做法来做这些事情,我会非常高兴在这里谈论它。

感谢!!!

0 个答案:

没有答案