【问题标题】:Reinject dependencies of a freshly deserialized object重新注入新反序列化对象的依赖项
【发布时间】:2011-02-10 03:51:01
【问题描述】:

如果一个程序实际上只是反序列化了一个对象(实际上并不重要,只是说使用了 BinaryFormatter)。

什么是重新注入此对象的依赖项的好设计?

这有一个共同的模式吗?

我想我需要将 Deserialize() 方法包装起来以充当容器内的工厂。

谢谢!

【问题讨论】:

    标签: c# dependency-injection ioc-container autofac


    【解决方案1】:

    您不应序列化具有自身无法序列化的依赖项的对象。

    相反,将其拆分为两个类:将可序列化的部分提取到一个单独的类中

    反序列化后,您可以将生成的对象与原始类的一个实例(具有依赖关系的实例)相关联。

    【讨论】:

    • “计算机科学中的所有问题都可以通过另一个层次的间接来解决,除了间接层太多的问题。”
    • 我认为我的建议是移除一层间接性。 (或者至少不需要额外的一个!);)
    • 不得不承认 Jeff,这是一个可能的解决方案,但我一直在想。我现在已经实现了它,代码库更适合它:)
    • 但是,如果我的 Character 实体中有 XP 和 Level 属性,并且级别是使用我的未序列化的 Formulas 类实例从 XP 计算出来的,该怎么办?我不想在单独的对象上拥有这些 Level 和 XP 属性!
    【解决方案2】:

    我会使用OnDeserialized 属性来指向一个可以进行重新注入的方法。

    【讨论】:

    • 但这肯定需要依赖容器本身,即打破黄金 IoC 规则?
    • 如果您使用的是 Microsoft.Practices.ServiceLocation 之类的东西,则不是这样,您是容器中立的。
    • 与容器无关,但仍依赖于容器。
    • 您可以使用静态类并将对象发送到那里,然后该类上的方法将进行注入。
    【解决方案3】:

    Unity 有一个“BuildUp”的概念,您可以要求它满足现有对象的依赖关系。我不知道 autofac(我猜你是从标签中使用的)是否有等价物。

    【讨论】:

    • 属性注入是 Autofac 等价物
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2011-03-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多