目前,我使用两种不同版本的内部业务对象,这些对象在API的工作方式上有一些重大差异。在发布针对两个版本的业务对象的产品时,我有两个单独的项目和安装程序。这导致了很多重复的代码。
是否有可能编写一个包装器,该包装器将公开一致的API,然后可以由单个项目使用,该项目可以使用两种不同的配置来确定要使用哪些业务对象?
NB 目前,业务对象是作为dll提供的,我无法访问源代码。
答案 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)
您可以编写业务类实现的接口,然后工厂模式可以帮助您实现目标。