2014-12-06 276 views
1

我创建一个应用程序,我使用的外墙设计模式,其中请求将经过 控制器(的WebAPI) - >幕墙 - >业务 - >库 ,我使用统一配置初始化我的对象(外观,业务和存储库),在控制器层我将设置Unity配置并初始化所有对象。但我的疑问是,我可以如何将资源库对象传递给业务层。 就像我在业务层使用仓库方法调用一样,它肯定会需要仓库对象,所以我将它注入到业务层构造函数中。请参见下面的代码:依赖注入

public class MessageBusiness : IMessageBusiness 

{ 
    IMessageRepository _messageRepository; 

    public MessageBusiness(IMessageRepository messageRepository) 
    { 
     _messageRepository = messageRepository; 
    } 
    public int AddMessage(RS.DomainEntity.Model.Message newMessage) 
    { 
     return _messageRepository.AddMessage(newMessage); 
    } 

}

现在我应该通过从外观层该库对象?

public class MessageFacade : IMessageFacade 
{ 
    IMessageBusiness _messageBusiness; 

    public MessageFacade(IMessageBusiness messageBusiness) 
    { 
     _messageBusiness = messageBusiness; 
    } 

    public int AddMessage(RS.DomainEntity.Model.Message newMessage) 
    { 
     return _messageBusiness.AddMessage(newMessage); 
    } 
} 

如果不是那么我可以注入这个存储库在我的业务层?如果是,那么我们也需要在Façade中传递它,就像将对象从一层传递到另一层。这是正确的行为? 另外如果你给第一个问题的答案,那么我如何在我的外墙层进行集成测试。任何想法?任何帮助深表感谢。提前致谢。 Regards, Vivek

+0

控制器必须包含一个使用Unity容器配置所有对象的点。 Facade只需要知道业务,它不必知道业务的实现,因此您不需要通过业务层传递库。 – Alezis 2014-12-06 10:31:36

回答

0

现在我应该从Façade层传递这个存储库对象吗?

不是,你不需要。在像您这样简单的图表中,您只需要一个统一控制器工厂和注入控制器的外观。 Unity将完成剩下的工作,初始化它将用于业务服务的外观,并且由于它需要一个存储库,Unity会查找并注入一个存储库,假设您事先注册了所有实现的接口。

Btw。我绝对推荐Unit of Work而不是Repository。 UoW更通用,允许客户访问所有可能的存储库。你可以把它看作所有存储库的容器。