事实:
我在申请时使用了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。
我希望这是通过配置,所以我可以获得灵活性。
顺便说一句:
如果有更好的做法来做这些事情,我会非常高兴在这里谈论它。
感谢!!!