你能解释这个城堡windsor注册吗?

时间:2013-07-26 20:34:31

标签: castle-windsor

我指的是this教程。

beginning,IController类型注册为:

public class ControllersInstaller:IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
                            .BasedOn<IController>()
                            .LifestyleTransient());
    }
}

但后来EventRepository注册如下:

public class RepositoriesInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
                            .Where(Component.IsInSameNamespaceAs<EventRepository>())
                            .WithService.DefaultInterfaces()
                            .LifestyleTransient()));
    }
}

两者有什么区别?我尝试使用用于IController注册的方法来注册IEventRepository,但它不起作用?为什么呢?

现在,在IEventRepository的情况下,它的实现EventRepository用于注册。如果我实现另一个类说AnotherEventRepository,那么我将不得不为此添加另一个注册。我们不能使用单一注册来注册所有类型的IEventRepository。

2 个答案:

答案 0 :(得分:0)

如果您需要注册所有实现IEventRepository的类,您需要添加如上所述的BasedOn。不要忘记你添加的地方......这意味着你只考虑属于那个ns的类。

答案 1 :(得分:0)

首次注册非常简单。您只需注册实现IController接口的所有类。这些课程也是他们的服务。所以,如果你想解决,例如。 HomeController您只需致电container.Resolve<HomeController>()

第二次注册从声明EventRepository的命名空间中获取所有类,并使用default interfaces注册它们。因此,如果您想解决EventRepository,则必须致电container.Resolve<IEventRepository>()

如果是AnotherEventRepository,则如果它位于同一名称空间中,则不必添加其他注册。但如果它也实现了IEventRepository,你实际上并不知道将解决哪些实现。