Asp.net web api webapi与统一IoC
我希望能够在我的Unity容器中为同一接口注册2个类。 然后,我想根据一个参数选择当前的实现 这是我的界面: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,
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);
}
}