我正在尝试创建一个中间层,允许我连接到Live服务或测试服务,而无需更改我的客户端。
我需要返回一个名为Product
的通用对象,以便在客户端中使用。我从中间层得到这个,但我不需要知道我是如何得到这个或它来自哪里。中间层连接到实时和测试服务,我只是调用一个方法来获取我需要的东西。
问题是将我从任何服务中获得的产品返回给客户端。该方法期待Product
,但它正在尝试发送LiveService.Product
或TestService.Product
。
有没有办法将这些类型转换为通用Product
类型,以便将它们返回给客户端?
以下是我目前创建的内容。
客户
Connection conn = new Connection("Test");
IServiceImplementation service = conn.GetServiceImplementation();
Product prod = service.GetProductUsingId(123);
中间层
public interface IServiceImplementation
{
Product GetProductUsingId (int productID);
}
public class Connection
{
private string mode;
public Connection(string _Mode)
{
mode = _Mode;
}
public IServiceImplementation GetServiceImplementation()
{
if (mode == "Live")
{
return new LiveService();
}
else if (mode == "Test")
{
return new TestService();
}
else
{
return null;
}
}
}
Public class LiveService : IServiceImplementation
{
public Product GetProductUsingId (int productID)
{
LiveService.Service live = new LiveService.Service();
return live.GetProduct(2638975);
}
}
Public class TestService : IServiceImplementation
{
public Product GetProductUsingId (int productID)
{
TestService.Service test = new TestService.Service();
return test.GetProduct(2638975);
}
}
答案 0 :(得分:0)
如您所见,Product,LiveService.Product和TestService.Product是三种不同的类型,无法相互转换。
如果您无法安排使用相同的类型,或者LiveService.Product和TestService.Product要继承Product,那么您的下一个选项是将属性从Live(Test)Service.Product复制到Product。 / p>
在我的示例中,我使用AutoMapper将属性值从Live(Test)Service.Product复制到Product。
值得一提的是,这些是三种不同的类型,如果三种类型中任何一种的任何属性发生变化,都可能导致问题。使用AutoMapper,任何不匹配的属性名称都将无法复制,而不会显示任何错误。这可能会导致您忽略未传递属性值的事实。
public IServiceImplementation GetServiceImplementation()
{
if (mode == "Live")
{
return new LiveServiceImplementation();
}
else if (mode == "Test")
{
return new TestServiceImplementation();
}
else
{
return null;
}
}
public class LiveServiceImplementation : IServiceImplementation
{
public LiveServiceImplementation()
{
Mapper.CreateMap<LiveService.Product, Product>();
}
public Product GetProductUsingId(int productID)
{
LiveService.Service _service = new LiveService.Service();
return Mapper.Map<LiveService.Product, Product>(_service.GetProduct(2638975));
}
}
public class TestServiceImplementation : IServiceImplementation
{
public TestServiceImplementation()
{
Mapper.CreateMap<TestService.Product, Product>();
}
public Product GetProductUsingId(int productID)
{
TestService.Service _service = new TestService.Service();
return Mapper.Map<TestService.Product, Product>(_service.GetProduct(2638975));
}
}