代码之家  ›  专栏  ›  技术社区  ›  Ben Aston

代表们可以在温莎城堡国际奥委会集装箱上登记吗?

  •  1
  • Ben Aston  · 技术社区  · 14 年前

    这可能是一个愚蠢的问题,但代表或活动是否可以注册到一个IOC容器(例如Windsor)中?

    我设想在应用程序启动时注册事件功能,实现策略模式。

    另一种方法是简单地将任何委托包装成类型,以便在容器中注册。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Mauricio Scheffer    14 年前

    不需要包装或子类函数来在Windsor中注册它们。它们就像其他组件一样工作。如果你想告诉别人 Func<int> 从另一个组件中,使用命名组件和服务重写,就像对任何其他组件一样。例子:

    [Test]
    public void Example() {
        var container = new DefaultKernel();
        container.Register(Component.For<Func<int>>().Instance(() => 42).Named("42"));
        container.Register(Component.For<Func<int>>().Instance(() => 44).Named("44"));
        container.Register(Component.For<Something>().DependsOn(ServiceOverride.ForKey("f").Eq("44")));
        var s = container.Resolve<Something>();
        Assert.AreEqual(44, s.I);
    }
    
    class Something {
        private readonly int i;
        public Something(Func<int> f) {
            i = f();
        }
    
        public int I {
            get { return i; }
        }
    }
    

    如果您希望使用容器分离事件注册,只需使用 Event wiring facility .

        2
  •  0
  •   Community CDub    8 年前

    我想说这是不可能的,因为你将如何解决依赖?

    如果一个班级要求一个 Func<bool> 你怎么区分不同的代表?

    包装委托的另一种方法是最好的解决方案,因为它允许您命名委托并将其组合到功能部分中。

    编辑 原来温莎城堡有一种命名实例的方法,因为它们是在国际奥委会注册的。所以这是可能的,但是您仍然需要为每个实例提供某种类型的名称。看莫里西奥·谢弗的 answer .

        3
  •  0
  •   Community CDub    8 年前

    如前所述,它工作得很好,如果使用 typed factory facility 因为它会呈现出一些意想不到的行为。委托依赖项可能会导致创建代理工厂。见 this question .