【问题标题】:Castle Windsor Dependency Injection - restore dependencies for existing instanceCastle Windsor Dependency Injection - 恢复现有实例的依赖项
【发布时间】:2010-11-08 20:24:36
【问题描述】:

我有一个相当直截了当的场景,我正在尝试解决,但我在 Windsor 上遇到了几堵砖墙 - 也许我试图以错误的方式解决问题?

我有一个名为 Foo 的类型如下:

public class Foo
{
    [NonSerialized]
    private IBar bar;

    public IBar Bar
    {
        get { return this.bar; }
        set { this.bar = value; }
    }

    public Foo(IBar bar)
    {
    }
}

我以正常方式通过容器实例化:

var myFoo = container.Resolve<Foo>();

依赖项 IBar 在容器中注册,并在创建对象时得到解析。现在类型已经创建好了,我需要序列化它,我不想序列化 IBar,所以它被标记了一个 NonSerialized 属性。

然后我需要反序列化对象并将其返回到以前的状态。我如何通过温莎城堡实现这一目标?我已经有一个实例,只是缺少它的依赖项。

如果我使用 Unity,我会使用 BuildUp() 来解决问题,但在这种情况下我想使用 Castle Windsor。

【问题讨论】:

    标签: c# dependency-injection castle-windsor


    【解决方案1】:

    Foo 似乎有多个问题。尝试通过为数据创建一个新类并将其用作Foo 类中的属性来将数据部分与行为分开:

    [Serializable]
    public class FooData
    {
    }
    
    public class Foo
    {
        private FooData data = new FooData();
    
        public IBar Bar { get; private set; }
    
        public FooData Data { get; set; }
    
        public Foo(IBar bar)
        {
        }
    }
    

    当你有了这个结构后,你可以反序列化 FooData 并在创建的 Foo 中使用它:

    var foo = container.Get<Foo>();
    foo.Data = DeserializeData();
    

    【讨论】:

    • 没有FooData,只有Bar。 Bar 不能被序列化。 Bar 甚至不需要暴露,但必须在对象反序列化时恢复。
    • 目前还没有FooData。但是你要创造它;这就是我要说的;-)
    • 我没有关注你! IBar 可能是 Foo 用来加载/保存数据的存储库。如何在反序列化后让我的存储库或 Bar 回到 Foo?
    • @Steve:如果您查看我回答中的最后两行代码,您会发现Foo 永远不会被序列化。您从容器中检索Foo 的一个新实例,并为其分配一个反序列化的FooData。如果这对您不起作用,请使用更多信息更新您的问题。我敢打赌那个对象不叫Foo,而是叫ShipOrderCommand?
    • 你是对的,Foo 类似于 Order 业务对象,而 Bar 是 OrderRepository。我需要对有状态的Order信息进行序列化/反序列化,然后恢复repositories等无状态依赖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多