0

我有一个 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反模式吗?

我认为这有一个很好的默认实现,并且由于我们将来可能需要在更多控制器中使用它,根据 Mark Seemann 的 .NET 中的依赖注入MessageProvider一书,这可能是Ambient Context设计模式的一个很好的候选者。

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

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

var messages = MessageProvider.Current.GetMessages()

我的控制器中的以下代码:

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

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

MessageProvider.SetMessageProvider(otherImplementation);

您认为这种方法有意义吗?我可能遗漏的任何缺点?

4

1 回答 1

0

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

于 2014-05-18T11:08:13.717 回答