在生产和测试Web服务之间切换。
对于相同的WebService定义,我有2个版本。每个版本都有其自己的数据库url等。
MyLib.FooWebServicePROD.FooWebService _serviceProd;
MyLib.FooWebServiceTEST.FooWebService _serviceTest;
现在,我将一种形式与另一种形式进行对比,我在Visual Studio中使用了“重命名”选项。
我想将所有实例和定义包装在摘要中,这样就不会每次都对程序进行编辑。
因此,我制作了我的单例public sealed class FooBarWrap
,但大量重复,例如:
public bool Close()
{
if (_serviceProd != null)
{
_serviceProd.logout(guid);
log4N.Info("Closing PROD");
}
if (_serviceTest != null)
{
_serviceTest.logout(guid);
log4N.Info("Closing TEST");
}
return true;
}
public bool Login()
{
try
{
log4N.Info("Connection to FooBar webservice...");
if (isProd)
{
_serviceProd = new MyLib.FooWebServicePROD.FooWebService();
_serviceProd.Timeout = System.Threading.Timeout.Infinite;
_serviceProd.Logon(guid);
}
else {
_serviceTest = new MyLib.FooWebServiceTEST.FooWebService();
_serviceTest.Timeout = System.Threading.Timeout.Infinite;
_serviceTest.Logon(guid);
}
log4N.Info("done");
return true;
}
catch (Exception ex)
{
log4N.Info("failed !");
log4N.Error("Echec connexion au webservice FooBar", ex);
return false;
}
}
if (FooBarWrap.Instance.Login()){
//DoSomething
var ClientResult = FooBarWrap.Instance.SomeRequest()
}
答案 0 :(得分:1)
有没有一种简单的方法可以做到这一点?没有客户端引用一个或另一个Web服务,也没有繁重的代码重复?
是的。
您可以简单地使用条件依赖注入,根据您所处的环境或主机名,端口号或url路径等任何其他条件,您将获得服务接口的不同实现。
一种简单的条件依赖注入,根据条件提供相同接口的一个或另一个实现。
kernel.Bind<ISomeService>().To<SomeService1>();
kernel.Bind<ISomeService>().To<SomeService2>().When(x => HttpContext.Current[host|port|url path] == "some value");
Ninject调用那种注入上下文绑定 https://github.com/ninject/ninject/wiki/Contextual-Binding