我有一个 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);
您认为这种方法有意义吗?我可能遗漏的任何缺点?