用于MessageProvider的依赖注入模式是什么?

时间:2014-05-17 12:18:21

标签: asp.net-mvc-4 dependency-injection service-locator ambientcontext

我有一个ContactController,我在TempData中设置了一条消息(这是为了在成功提交后在屏幕上显示一条消息),在布局中,有一部分_Message.cshtml应该呈现消息,如果有的话。方法签名如下:

List<Message> GetMessages(IDictionary<string, object> dictionary);
void SetMessage(IDictionary<string, object> dictionary, string body, MessageType type);

最初我考虑过在构造函数中注入MessageProvider依赖项。但后来我想到:如果我需要在其他控制器中执行此操作,该怎么办?另外,对于我在局部视图中使用它,我需要从容器中解析实现,我认为这是一个可以接受的解决方案,可以在扩展WebViewPage的类中使用(考虑到我不打算单元测试它) )。

public MyCustomViewPage()
{
  this.MessageProvider = DependencyResolver.Current.GetService<MessageProvider>();
}

public MessageProvider MessageProvider { get; set; }

但是我们可以使用另一种依赖注入模式来避免Service Locator反模式吗?

我在想这个MessageProvider有一个很好的默认实现,因为我们将来可能需要在更多的控制器中使用它,这可能是Ambient Context设计模式的一个很好的候选者。 Dependency Injection in .NET by Mark Seemann

这样,我将消除将来必须更改其他控制器构造函数的潜在问题,以防我碰巧必须在其中设置消息,我将消除使用Service Locator反模式的需要在MyCustomViewPage构造函数中,我的控制器仍然是可测试的。

然后我会在局部视图中使用以下代码:

var messages = MessageProvider.Current.GetMessages()

我控制器中的以下代码:

MessageProvider.Current.SetMessage("Message sent successfully.", MessageType.Success);

在我的测试装置中(如果我真的需要另一个实现):

MessageProvider.SetMessageProvider(otherImplementation);

你认为这种方法有意义吗?我可能会缺少哪些缺点?

1 个答案:

答案 0 :(得分:0)

对于可能在将来寻找相同答案的任何人,由于我在问题中提到的原因,我决定使用Ambient Context