我有一个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);
你认为这种方法有意义吗?我可能会缺少哪些缺点?
答案 0 :(得分:0)
对于可能在将来寻找相同答案的任何人,由于我在问题中提到的原因,我决定使用Ambient Context
。