【发布时间】:2011-10-18 10:03:13
【问题描述】:
环境简介:
我有一个代表聊天室并依赖于记录器的类。它与具有横切关注点的系统范围的记录器不同,而是与特定聊天室相关联的记录器。它将聊天室中的所有活动记录到其唯一的日志文件中。创建聊天室时我想打开日志文件,而当它被销毁时我想关闭日志文件。
问题
这是我正在使用的相关代码。
public interface IChatroomLogger
{
void Log(ServerPacket packet);
void Open();
void Close();
}
public class ChatroomLogger : IChatroomLogger
{
// chatroom name will be used as a file name
public ChatroomLogger(string chatroomName) { ... }
public void Log(ServerPacket packet) { ... }
}
public class Chatroom
{
public Chatroom(string name, IChatroomLogger logger)
{
this.name = name;
this.logger = logger;
this.logger.Open();
}
public IChatromLogger Logger { get { return this.logger; } }
}
public interface IChatManager
{
Chatroom Get(chatroomName);
}
它在应用程序中是这样使用的:
var room = ChatManager.Get(chatroomName);
romm.DoStuff();
room.Logger.LogPacket(receivedPacket);
ChatManager 是一个包含对所有聊天室的引用并负责创建和删除它们的类。我还没有写它,但这是我一直在编写的接口。
问题
如何让ChatManager 创建Chatroom 的新实例并仍然使用依赖注入??
我正在使用 Unity 完成所有其他 DI 工作。到目前为止,它工作得很好。但我不确定如何解决这个难题。
当我对ChatManager 的具体实现创建新聊天室时,它必须传入IChatroomLogger。它不知道如何构建它……但 Unity 知道。但随后我必须将IUnityContainer 传递到ChatManager。
public class ChatManager : IChatManager
{
public ChatManager(IUnityContainer container)
{
this.container = container;
}
public Chat Get(string chatroomName)
{
// get logger from Unity somehow. Not sure how I'd
// pass chatroomName to the concrete instance
var logger = ...
return new Chatroom(chatroomName, logger);
}
}
出于某种原因,这似乎是错误的。让域对我正在使用的 DI 容器一无所知似乎更干净。
如果我的应用程序正在运行,我如何在不采用某种服务定位器设计的情况下获得 Chatroom 类的新实例?我是不是想多了?绕过Unity不是什么大不了的事吗?欢迎任何想法!
【问题讨论】:
-
@Mark Seemann - 你无处不在!说真的,你能有多少明智的建议?你只是一个人! :)。我想我可以预订你的那本书……
标签: c# dependency-injection unity-container ioc-container