Castle Windsor: SelectHandler should be called only during resolving?












0















I am using Castle Windsor 4.1.1. For simplicity I have created demo to illustrate the problem:



This is container initialization:



using(var container = new WindsorContainer())
{
container.Kernel.AddHandlerSelector(new HandlerSelector());

// Should not call handler selector
container.Register(Component.For<IA>().ImplementedBy<AImpl>());
container.Register(Component.For<IB>().ImplementedBy<BImpl>());

// Should call handler selector
container.Resolve<IA>();
}


AImpl depends on IB. (Just constructor injection)



When I call container.Register it calls HasOpinionAbout, and SelectHandler.



Question is pretty straightforward. Is it supposed to work like that?



Here is quote from official documentation:




Handler selectors let you dynamically choose a component to satisfy
the requested service and override Windsor's default behavior. This is
particularly useful in multi-tenant applications.




I was expecting that these functions should get called only during resolving not during registration. (They get called both during resolving and registration.)



They cleary state that it is usefull for multi-tenant applications, so in most cases tenant is determined during resolving, not during registration.



Is my assumption correct?



GitHub Issue #461










share|improve this question




















  • 1





    If those components were being registered for a multi-tenant application, one assumes they would not be registered as Singleton, as you have done here.

    – Phil Degenhardt
    Dec 31 '18 at 0:37











  • @PhilDegenhardt You are correct. I missed that. Can you post it as answer?

    – Aram Kocharyan
    Dec 31 '18 at 10:23
















0















I am using Castle Windsor 4.1.1. For simplicity I have created demo to illustrate the problem:



This is container initialization:



using(var container = new WindsorContainer())
{
container.Kernel.AddHandlerSelector(new HandlerSelector());

// Should not call handler selector
container.Register(Component.For<IA>().ImplementedBy<AImpl>());
container.Register(Component.For<IB>().ImplementedBy<BImpl>());

// Should call handler selector
container.Resolve<IA>();
}


AImpl depends on IB. (Just constructor injection)



When I call container.Register it calls HasOpinionAbout, and SelectHandler.



Question is pretty straightforward. Is it supposed to work like that?



Here is quote from official documentation:




Handler selectors let you dynamically choose a component to satisfy
the requested service and override Windsor's default behavior. This is
particularly useful in multi-tenant applications.




I was expecting that these functions should get called only during resolving not during registration. (They get called both during resolving and registration.)



They cleary state that it is usefull for multi-tenant applications, so in most cases tenant is determined during resolving, not during registration.



Is my assumption correct?



GitHub Issue #461










share|improve this question




















  • 1





    If those components were being registered for a multi-tenant application, one assumes they would not be registered as Singleton, as you have done here.

    – Phil Degenhardt
    Dec 31 '18 at 0:37











  • @PhilDegenhardt You are correct. I missed that. Can you post it as answer?

    – Aram Kocharyan
    Dec 31 '18 at 10:23














0












0








0








I am using Castle Windsor 4.1.1. For simplicity I have created demo to illustrate the problem:



This is container initialization:



using(var container = new WindsorContainer())
{
container.Kernel.AddHandlerSelector(new HandlerSelector());

// Should not call handler selector
container.Register(Component.For<IA>().ImplementedBy<AImpl>());
container.Register(Component.For<IB>().ImplementedBy<BImpl>());

// Should call handler selector
container.Resolve<IA>();
}


AImpl depends on IB. (Just constructor injection)



When I call container.Register it calls HasOpinionAbout, and SelectHandler.



Question is pretty straightforward. Is it supposed to work like that?



Here is quote from official documentation:




Handler selectors let you dynamically choose a component to satisfy
the requested service and override Windsor's default behavior. This is
particularly useful in multi-tenant applications.




I was expecting that these functions should get called only during resolving not during registration. (They get called both during resolving and registration.)



They cleary state that it is usefull for multi-tenant applications, so in most cases tenant is determined during resolving, not during registration.



Is my assumption correct?



GitHub Issue #461










share|improve this question
















I am using Castle Windsor 4.1.1. For simplicity I have created demo to illustrate the problem:



This is container initialization:



using(var container = new WindsorContainer())
{
container.Kernel.AddHandlerSelector(new HandlerSelector());

// Should not call handler selector
container.Register(Component.For<IA>().ImplementedBy<AImpl>());
container.Register(Component.For<IB>().ImplementedBy<BImpl>());

// Should call handler selector
container.Resolve<IA>();
}


AImpl depends on IB. (Just constructor injection)



When I call container.Register it calls HasOpinionAbout, and SelectHandler.



Question is pretty straightforward. Is it supposed to work like that?



Here is quote from official documentation:




Handler selectors let you dynamically choose a component to satisfy
the requested service and override Windsor's default behavior. This is
particularly useful in multi-tenant applications.




I was expecting that these functions should get called only during resolving not during registration. (They get called both during resolving and registration.)



They cleary state that it is usefull for multi-tenant applications, so in most cases tenant is determined during resolving, not during registration.



Is my assumption correct?



GitHub Issue #461







c# inversion-of-control castle-windsor






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Dec 31 '18 at 10:20







Aram Kocharyan

















asked Dec 29 '18 at 16:14









Aram KocharyanAram Kocharyan

1,743833




1,743833








  • 1





    If those components were being registered for a multi-tenant application, one assumes they would not be registered as Singleton, as you have done here.

    – Phil Degenhardt
    Dec 31 '18 at 0:37











  • @PhilDegenhardt You are correct. I missed that. Can you post it as answer?

    – Aram Kocharyan
    Dec 31 '18 at 10:23














  • 1





    If those components were being registered for a multi-tenant application, one assumes they would not be registered as Singleton, as you have done here.

    – Phil Degenhardt
    Dec 31 '18 at 0:37











  • @PhilDegenhardt You are correct. I missed that. Can you post it as answer?

    – Aram Kocharyan
    Dec 31 '18 at 10:23








1




1





If those components were being registered for a multi-tenant application, one assumes they would not be registered as Singleton, as you have done here.

– Phil Degenhardt
Dec 31 '18 at 0:37





If those components were being registered for a multi-tenant application, one assumes they would not be registered as Singleton, as you have done here.

– Phil Degenhardt
Dec 31 '18 at 0:37













@PhilDegenhardt You are correct. I missed that. Can you post it as answer?

– Aram Kocharyan
Dec 31 '18 at 10:23





@PhilDegenhardt You are correct. I missed that. Can you post it as answer?

– Aram Kocharyan
Dec 31 '18 at 10:23












1 Answer
1






active

oldest

votes


















1














You need to use a different lifestyle (than Singleton, which is the default) if you want to be able to have different component instances for different tenants.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53971187%2fcastle-windsor-selecthandler-should-be-called-only-during-resolving%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    You need to use a different lifestyle (than Singleton, which is the default) if you want to be able to have different component instances for different tenants.






    share|improve this answer




























      1














      You need to use a different lifestyle (than Singleton, which is the default) if you want to be able to have different component instances for different tenants.






      share|improve this answer


























        1












        1








        1







        You need to use a different lifestyle (than Singleton, which is the default) if you want to be able to have different component instances for different tenants.






        share|improve this answer













        You need to use a different lifestyle (than Singleton, which is the default) if you want to be able to have different component instances for different tenants.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 1 at 20:13









        Phil DegenhardtPhil Degenhardt

        6,28222845




        6,28222845






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53971187%2fcastle-windsor-selecthandler-should-be-called-only-during-resolving%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Monofisismo

            Angular Downloading a file using contenturl with Basic Authentication

            Olmecas