Asp.net web api webapi与统一IoC

Asp.net web api webapi与统一IoC,asp.net-web-api,inversion-of-control,unity-container,Asp.net Web Api,Inversion Of Control,Unity Container,我希望能够在我的Unity容器中为同一接口注册2个类。 然后,我想根据一个参数选择当前的实现 这是我的界面: public interface ICheckService { HttpResponseMessage Validate(string p1, string p2); } } 我的服务: public class CheckService1 : ICheckService { public HttpResponseMessage Validate(string p1,

我希望能够在我的Unity容器中为同一接口注册2个类。 然后,我想根据一个参数选择当前的实现

这是我的界面:

public interface ICheckService
{
    HttpResponseMessage Validate(string p1, string p2);
}
}
我的服务:

public class CheckService1 : ICheckService
{
    public HttpResponseMessage Validate(string p1, string p2)
    {
      /////code
    }
}

public class CheckService2 : ICheckService
{
    public HttpResponseMessage Validate(string p1, string p2)
    {
        ////code
    }
}
        `container.RegisterType<ICheckService, CheckService1>();`
        `container.RegisterType<ICheckService, CheckService2>();`
在bootstraper.cs中,我声明我的服务:

public class CheckService1 : ICheckService
{
    public HttpResponseMessage Validate(string p1, string p2)
    {
      /////code
    }
}

public class CheckService2 : ICheckService
{
    public HttpResponseMessage Validate(string p1, string p2)
    {
        ////code
    }
}
        `container.RegisterType<ICheckService, CheckService1>();`
        `container.RegisterType<ICheckService, CheckService2>();`
现在,我想在校准api时,根据p1参数选择实现

如果p1等于Service1,则从Service1类调用Validate方法;如果p1等于Service2,则从Service2类调用Validate方法


谢谢你的帮助。

你应该使用工厂,而不是容器。工厂实现可以从容器内部请求适当的实现(即,这只是一个实现细节,而不是工厂调用程序应该知道的任何内容)

但关键是,直接使用国际奥委会并不适合你的情况

public class ServiceController : ApiController
{
    private readonly ICheckServiceFactory _checkFactory;

    public ServiceController(ICheckServiceFactory factory)
    {
        _checkFactory = factory;
    }
    [HttpGet]
    public HttpResponseMessage Validate(string p1, string p2)
    {
        var service = _checkFactory.Create(p1);
        service.Validate(p1, p2);
    }
 }

在您的案例中,CheckService1和CheckService2是验证的实现类/详细信息。您可以创建一个CheckServiceFactory,它可以在运行时为您创建这些类。注册工厂类而不是实现类。

另一个选项是使用策略模式。类将充当检查服务的工厂。工厂类将初始化ICheckServices的字典。工厂(ICheckServiceFactory)将使用所选的IoC容器进行注册:

public interface ICheckServiceFactory
{
    string Validate(string validationStrategy, string stringToValidate);
}

public class CheckServiceFactory : ICheckServiceFactory
{
    private readonly Dictionary<string, ICheckService> _checkServices;

    public CheckServiceFactory()
    {
        _checkServices = new Dictionary<string, ICheckService>
        {
            {"cash", new CheckService1()},
            {"card", new CheckService2()}
        };
    }

    public string Validate(string validationStrategy, string stringToValidate)
    {
        return  $"Parameter '{stringToValidate}' is Valid equal {_checkServices[validationStrategy].Validate(stringToValidate)} using {_checkServices[validationStrategy].CheckType}";
    }
}
因此,您的服务控制器的外观将与您最初希望它的外观相似:

public class ServiceController : ApiController
{
    private readonly ICheckServiceFactory _checkServiceFactory;

    public ServiceController(ICheckServiceFactory factory)
    {
        _checkServiceFactory = factory;
    }
    [HttpGet]
    public HttpResponseMessage Validate(string p1, string p2)
    {
        return _checkServiceFactory.Validate(p1, p2);
    }
}