Unity C#使用Zenject时如何向Activator创建的已有对象注入依赖
Zenject手动注入已创建实例的解决方案
解决步骤
- 先在你实现
GetTask方法的类中,注入Zenject的核心容器DiContainer:
// 在GetTask所属类中添加注入字段 [Inject] private DiContainer _diContainer;
- 修改
GetTask方法,在你通过Activator.CreateInstance创建实例后,调用容器的Inject方法完成手动依赖注入:
public Task GetTask(byte header) { Log.WriteConsole($"== packet type={header}"); PacketType packetType = _packetType.GetType().GetFields() .Select(field => (PacketType)field.GetValue(_packetType)) .First(p => p.Header.Equals(header)); Task taskInstance = (Task)Activator.CreateInstance(packetType.Type); // 手动注入已注册的依赖 _diContainer.Inject(taskInstance); return taskInstance; }
额外说明
- 你提供的代码中
LoginTask的SetPacket方法里用了小写的serializer,但父类声明的注入字段是大写开头的Serializer,需要修正变量名避免空引用。 - 若你没有必须使用
Activator.CreateInstance的强制要求,可以直接用DiContainer提供的实例化方法,一步完成创建+注入:
Task taskInstance = (Task)_diContainer.Instantiate(packetType.Type);
- 请确认你已经在项目的Zenject Installer中正确注册了带Id标记的
ISerializer实现,示例注册代码如下:
// 示例:在你的Installer类的InstallBindings方法中添加 Container.Bind<ISerializer>().WithId("Json").To<你自己的Json序列化实现类>().AsSingle();
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

