Pattern for multiple renderings calling same service
Scenario
A page contains several separate renderings. Each rendering displays some data which is returned from a remote service. Several of these data items come from the same remote service.
This leads to that service being requested multiple times per page load, which seems inefficient.
Separate renderings are desirable as they can be used elsewhere on the website, and provides content editors flexibility.
Solutions
Does an established pattern exist to handle this scenario in an efficient way?
presentation
add a comment |
Scenario
A page contains several separate renderings. Each rendering displays some data which is returned from a remote service. Several of these data items come from the same remote service.
This leads to that service being requested multiple times per page load, which seems inefficient.
Separate renderings are desirable as they can be used elsewhere on the website, and provides content editors flexibility.
Solutions
Does an established pattern exist to handle this scenario in an efficient way?
presentation
add a comment |
Scenario
A page contains several separate renderings. Each rendering displays some data which is returned from a remote service. Several of these data items come from the same remote service.
This leads to that service being requested multiple times per page load, which seems inefficient.
Separate renderings are desirable as they can be used elsewhere on the website, and provides content editors flexibility.
Solutions
Does an established pattern exist to handle this scenario in an efficient way?
presentation
Scenario
A page contains several separate renderings. Each rendering displays some data which is returned from a remote service. Several of these data items come from the same remote service.
This leads to that service being requested multiple times per page load, which seems inefficient.
Separate renderings are desirable as they can be used elsewhere on the website, and provides content editors flexibility.
Solutions
Does an established pattern exist to handle this scenario in an efficient way?
presentation
presentation
asked 2 hours ago
SteveSteve
1555
1555
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Register the service in your DI scoped for the request.
When the first component calls the service, save the value in the service.
When next component wants the same data, the service will already have it.
I used this blog post as a guide how to:
https://www.coreysmith.co/sitecore-dependency-injection-scoped-services/
In shortcut - register service:
public class ExampleConfigurator : IServicesConfigurator
{
public void Configure(IServiceCollection serviceCollection)
{
serviceCollection.AddScoped<IScopedService, ScopedService>();
}
}
And the service itself:
public class ScopedService : IScopedService
{
private object _externalData;
public object ExternalData
{
get { return _externalData ?? (_externalData = GetDataFromExternalProvider()); }
}
}
And register the configurator:
<configuration>
<sitecore>
<services>
<configurator type= "ExampleConfigurator, MyAssembly"/>
</services>
</sitecore>
<configuration>
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "664"
};
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: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
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%2fsitecore.stackexchange.com%2fquestions%2f17864%2fpattern-for-multiple-renderings-calling-same-service%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
Register the service in your DI scoped for the request.
When the first component calls the service, save the value in the service.
When next component wants the same data, the service will already have it.
I used this blog post as a guide how to:
https://www.coreysmith.co/sitecore-dependency-injection-scoped-services/
In shortcut - register service:
public class ExampleConfigurator : IServicesConfigurator
{
public void Configure(IServiceCollection serviceCollection)
{
serviceCollection.AddScoped<IScopedService, ScopedService>();
}
}
And the service itself:
public class ScopedService : IScopedService
{
private object _externalData;
public object ExternalData
{
get { return _externalData ?? (_externalData = GetDataFromExternalProvider()); }
}
}
And register the configurator:
<configuration>
<sitecore>
<services>
<configurator type= "ExampleConfigurator, MyAssembly"/>
</services>
</sitecore>
<configuration>
add a comment |
Register the service in your DI scoped for the request.
When the first component calls the service, save the value in the service.
When next component wants the same data, the service will already have it.
I used this blog post as a guide how to:
https://www.coreysmith.co/sitecore-dependency-injection-scoped-services/
In shortcut - register service:
public class ExampleConfigurator : IServicesConfigurator
{
public void Configure(IServiceCollection serviceCollection)
{
serviceCollection.AddScoped<IScopedService, ScopedService>();
}
}
And the service itself:
public class ScopedService : IScopedService
{
private object _externalData;
public object ExternalData
{
get { return _externalData ?? (_externalData = GetDataFromExternalProvider()); }
}
}
And register the configurator:
<configuration>
<sitecore>
<services>
<configurator type= "ExampleConfigurator, MyAssembly"/>
</services>
</sitecore>
<configuration>
add a comment |
Register the service in your DI scoped for the request.
When the first component calls the service, save the value in the service.
When next component wants the same data, the service will already have it.
I used this blog post as a guide how to:
https://www.coreysmith.co/sitecore-dependency-injection-scoped-services/
In shortcut - register service:
public class ExampleConfigurator : IServicesConfigurator
{
public void Configure(IServiceCollection serviceCollection)
{
serviceCollection.AddScoped<IScopedService, ScopedService>();
}
}
And the service itself:
public class ScopedService : IScopedService
{
private object _externalData;
public object ExternalData
{
get { return _externalData ?? (_externalData = GetDataFromExternalProvider()); }
}
}
And register the configurator:
<configuration>
<sitecore>
<services>
<configurator type= "ExampleConfigurator, MyAssembly"/>
</services>
</sitecore>
<configuration>
Register the service in your DI scoped for the request.
When the first component calls the service, save the value in the service.
When next component wants the same data, the service will already have it.
I used this blog post as a guide how to:
https://www.coreysmith.co/sitecore-dependency-injection-scoped-services/
In shortcut - register service:
public class ExampleConfigurator : IServicesConfigurator
{
public void Configure(IServiceCollection serviceCollection)
{
serviceCollection.AddScoped<IScopedService, ScopedService>();
}
}
And the service itself:
public class ScopedService : IScopedService
{
private object _externalData;
public object ExternalData
{
get { return _externalData ?? (_externalData = GetDataFromExternalProvider()); }
}
}
And register the configurator:
<configuration>
<sitecore>
<services>
<configurator type= "ExampleConfigurator, MyAssembly"/>
</services>
</sitecore>
<configuration>
edited 1 hour ago
answered 2 hours ago
Marek MusielakMarek Musielak
11.4k11136
11.4k11136
add a comment |
add a comment |
Thanks for contributing an answer to Sitecore Stack Exchange!
- 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%2fsitecore.stackexchange.com%2fquestions%2f17864%2fpattern-for-multiple-renderings-calling-same-service%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