c#两个不同版本的业务对象的包装器

时间:2015-05-01 12:56:17

标签: c# .net

目前,我使用两种不同版本的内部业务对象,这些对象在API的工作方式上有一些重大差异。在发布针对两个版本的业务对象的产品时,我有两个单独的项目和安装程序。这导致了很多重复的代码。

是否有可能编写一个包装器,该包装器将公开一致的API,然后可以由单个项目使用,该项目可以使用两种不同的配置来确定要使用哪些业务对象?

NB 目前,业务对象是作为dll提供的,我无法访问源代码。

2 个答案:

答案 0 :(得分:1)

正如@jacobRoberts所说,您可以将DI容器与IOC一起使用,特别是允许通过xml配置进行注册的容器,例如: Unity,WindsorCastle等。

  

它是如何工作的?   您将使用抽象而不是实现。意味着您必须使用Interface而不是使用Business对象类。   E.g。

public interface IBusinessObj
{
 void DoBusiness();
}

public class BusinessObj1 : IBusinessObj
{
  public void DoBusiness()
  {
    // Your implementation based goes here specific to BusinessObj1 type
  }
}

public class BusinessObj2 : IBusinessObj
{
  public void DoBusiness()
  {
    // Your implementation based goes here specific to BusinessObj2 type
  }
}

现在让我们去消费者阶层:

public class UILayerController
{
 // Here either you can use the Property injection
 public IBusinessObj MyBusinessStuff {get; set ;}

 // OR
 //you can use the constructor injection with private field 
 private IBusinessObj  _myBusinessStuff
 public UILayerController(IBusinessObj  myBusinessStuff)
 {
  _myBusinessStuff = myBusinessStuff;
 }
}

现在您需要创建一个注册类或DIContainer,它将帮助您在运行时解析实例。

请参阅this article for using Unity for registration via Configuration or via class.

  

更新:   如果您想使用Class Name而不是Interface,则可以使用Unity执行此操作。只需替换Interface by Business实体类名称,并在Unity类中保留注入类型。现在,在设计时配置中,您可以添加以下内容:

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <container>

      <register type="YourApplication.BusinessObjectClass" mapTo="<ProvidedDll1>.<Namespace>.BusinessObjectClass" />

       <!-- For second business class just change the mapping to -->

      <register type="YourApplication.BusinessObjectClass" mapTo="<ProvidedDll2>.<Namespace>.BusinessObjectClass" />

    </container>
  </unity>
</configuration>

这里mapTo属性将具有驻留在Business dll中的类的完整命名空间。

现在Unity容器的初始化将是这样的:

UnityContainer container = new UnityContainer();
container.LoadConfiguration();

所以下次你需要添加不同的实现。您只需要为其添加单独的统一配置文件。 见thread how to split the configuration in separate files for Configurations.

答案 1 :(得分:0)

您可以编写业务类实现的接口,然后工厂模式可以帮助您实现目标。