环境的快速描述:
我有一个代表聊天室并依赖于记录器的类。它与具有横切关注点的系统范围记录器不同,而是与特定聊天室绑定的记录器。它将该聊天室中的所有活动记录到其唯一的日志文件中。当聊天室创建时,我想打开日志文件,当聊天室被销毁时,我想关闭日志文件。
问题
这是我正在使用的相关代码。
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);
The 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不是没什么大不了的吗?欢迎任何想法!