Asp.net mvc MVC自定义属性和绑定

Asp.net mvc MVC自定义属性和绑定,asp.net-mvc,binding,custom-attributes,Asp.net Mvc,Binding,Custom Attributes,我有一个项目,我们有自己的客户注册和帐户管理系统,但应用程序的某些元素链接到第三方服务。这些服务具有通用功能,例如在其自己的数据库中创建帐户,但底层实现在如何与第三方服务交互方面会有所不同 到目前为止,我所做的是创建一个实现ICCustomerRepository的CustomerRepository。这包含了我们自己的所有具体要求。ICCustomerRepository还为所有第三方都将拥有的常用方法定义,但这些方法在CustomerRepository类中设置为virtual,如果调用这些

我有一个项目,我们有自己的客户注册和帐户管理系统,但应用程序的某些元素链接到第三方服务。这些服务具有通用功能,例如在其自己的数据库中创建帐户,但底层实现在如何与第三方服务交互方面会有所不同

到目前为止,我所做的是创建一个实现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;
    }
}