Table of Contents

Use 2sxc Services in Dnn Themes - Extended

This is some additional information regarding the use of 2sxc Services in Dnn Themes.

👉🏽 Normally you don't need this, you need Use 2sxc Data, Services or Output in Dnn Themes/Skins and Modules

Get Service Provider on a Theme / Skin

This is unfortunately not prepared well - I guess at the time it was developed this wasn't seen as an important use case.

  • Dnn has Dependency Injection prepared for each request
  • Each Request has a separate Scope (to not mix services between requests)
  • This scoped Service-Provider is cached on the HttpContext
  • Dnn has a special extension method called GetScope() to work with this - see docs

To get a 2sxc Service in a Skin, you can write code like this: Note that this is harder and not recommended.

The general way to get the service provider is:

<%@ Import Namespace="DotNetNuke.Common.Extensions" %>
<%@ Import Namespace="Microsoft.Extensions.DependencyInjection" %>
<%@ Import Namespace="ToSic.Sxc.Services" %>

<script runat="server">
  protected override void OnPreRender(EventArgs e) {
    base.OnPreRender(e);
    var sp = HttpContext.Current.GetScope().ServiceProvider;
    var renderService = sp.GetService<IRenderService>();
  }
</script>

or another example

using DotNetNuke.Common.Extensions;
using System;
using Microsoft.Extensions.DependencyInjection;
using ToSic.Sxc.Services;

var sp = HttpContext.Current.GetScope().ServiceProvider;
var jsonSvc = sp.GetService<IJsonService>();
var json = jsonSvc.ToJson(someObject);