Castle Windsor: SelectHandler should be called only during resolving?
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
add a comment |
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
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
add a comment |
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
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
c# inversion-of-control castle-windsor
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
add a comment |
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
add a comment |
1 Answer
1
active
oldest
votes
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.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
answered Jan 1 at 20:13
Phil DegenhardtPhil Degenhardt
6,28222845
6,28222845
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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