Asp.net mvc MVC自定义属性和绑定
我有一个项目,我们有自己的客户注册和帐户管理系统,但应用程序的某些元素链接到第三方服务。这些服务具有通用功能,例如在其自己的数据库中创建帐户,但底层实现在如何与第三方服务交互方面会有所不同 到目前为止,我所做的是创建一个实现ICCustomerRepository的CustomerRepository。这包含了我们自己的所有具体要求。ICCustomerRepository还为所有第三方都将拥有的常用方法定义,但这些方法在CustomerRepository类中设置为virtual,如果调用这些方法,将抛出异常,要求您在第三方类中实现它们 从这里,我有:Asp.net mvc MVC自定义属性和绑定,asp.net-mvc,binding,custom-attributes,Asp.net Mvc,Binding,Custom Attributes,我有一个项目,我们有自己的客户注册和帐户管理系统,但应用程序的某些元素链接到第三方服务。这些服务具有通用功能,例如在其自己的数据库中创建帐户,但底层实现在如何与第三方服务交互方面会有所不同 到目前为止,我所做的是创建一个实现ICCustomerRepository的CustomerRepository。这包含了我们自己的所有具体要求。ICCustomerRepository还为所有第三方都将拥有的常用方法定义,但这些方法在CustomerRepository类中设置为virtual,如果调用这些
ThirdPartyACustomer : CustomerRepository, IThirdPartyACustomer
ThirdPartyBCustomer : CustomerRepository
正如您可能猜到的,这两个子类都继承并重写了虚拟方法,但ThirdPartyCustomer除外,它还实现了特定于特定类型的第三方用户的其他方法(例如,用户可以在某个地方编辑与第三方a相关的特定功能,而第三方B不提供这些功能
现在,我的问题的真正基础是:
我的应用程序中的一些进程(控制器)可以使用CustomerRepository而不会出现任何问题,因为它们只需要我们的核心功能
应用程序中的其他进程需要传递特定类型的ICCustomerRepository。任何调用CustomerRepository中定义为virtual的方法的操作都需要传递ThirdPartyCustomer或ThirdPartyCustomer,以便调用正确的实现
最初,在这种控制器的初始化中,我会做如下操作:
public RegistrationController()
{
ICustomerRepository _customerRepository = GetCustomerRepository();
}
其中GetCustomerRepository()有一些逻辑,例如,基于子域确定要使用哪种类型的第三方
现在,我想通过创建自定义属性来改进这一点,如下所示:
[ThirdPartyDependent]
class RegistrationController
{
public RegistrationController(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
}
并将customerRepository参数的填充移动到该属性中,例如GetCustomerRepository中的逻辑将在其中发生
我相当肯定这样的东西是可行的,并且对于测试目的来说似乎是有意义的,但是我不太确定我应该搜索什么,或者是否有更好的方法来做事情,所以请从更有MVC经验的人那里寻求一些指导。这是您的DI框架的责任。例如,Ninject提供u在配置依赖项时访问HttpContext,因此您可以根据某个HttpContext值选择适当的实现。例如:
kernel.Bind<ICustomerRepository>().ToMethod(ctx =>
{
if (HttpContext.Current.... Test something on the request or domain or whatever)
{
return new ThirdPartyACustomer();
}
return ThirdPartyBCustomer();
});
我还没有试过DI,看来这就是我明天要读的内容,谢谢。:)
public class RegistrationController: Controller
{
private readonly ICustomerRepository _customerRepository;
public RegistrationController(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
}