Dependency injection Sitecore Microsoft依赖项注入错误“;服务已被释放,无法创建对象“;

Dependency injection Sitecore Microsoft依赖项注入错误“;服务已被释放,无法创建对象“;,dependency-injection,sitecore8,glass-mapper,helix,Dependency Injection,Sitecore8,Glass Mapper,Helix,我正在使用Sitecore 8.2更新4和Helix框架,还使用Microsoft扩展依赖项注入。我已经为DI执行了几个步骤: 1.创建基础层中的DI项目。 2.我在管道上创建了名为Habitat.Foundation.DI.RegisterControllers的管道。 App_config/Include/zFoundation <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"><sitecore

我正在使用Sitecore 8.2更新4和Helix框架,还使用Microsoft扩展依赖项注入。我已经为DI执行了几个步骤: 1.创建基础层中的DI项目。 2.我在管道上创建了名为Habitat.Foundation.DI.RegisterControllers的管道。 App_config/Include/zFoundation

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"><sitecore>  <services> <configurator type=" Habitat.Foundation.DI.RegisterControllers, Habitat.Foundation.DI" /></services></sitecore></configuration>

namespace Habitat.Foundation.DI{   public class RegisterControllers : IServicesConfigurator
{
    public void Configure(IServiceCollection serviceCollection)
    {
        serviceCollection.AddMvcControllers("*.Feature.*");
    }
}}

namespace Habitat.Foundation.DI.Extensions{
public static class ServiceCollectionExtensions
{
    public static void AddMvcControllers(this IServiceCollection serviceCollection, params string[] assemblyFilters)
    {
        var assemblies = GetAssemblies.GetByFilter(assemblyFilters);

        AddMvcControllers(serviceCollection, assemblies);
    }

    public static void AddMvcControllers(this IServiceCollection serviceCollection, params Assembly[] assemblies)
    {
        var controllers = GetTypes.GetTypesImplementing<IController>(assemblies)
            .Where(controller => controller.Name.EndsWith("Controller", StringComparison.Ordinal));

        foreach (var controller in controllers)
            serviceCollection.AddTransient(controller);

        controllers = GetTypes.GetTypesImplementing<ApiController>(assemblies)
            .Where(controller => controller.Name.EndsWith("Controller", StringComparison.Ordinal));

        foreach (var controller in controllers)
            serviceCollection.AddTransient(controller);
    }
}}
public static class GetAssemblies
{
    public static Assembly[] GetByFilter(params string[] assemblyFilters)
    {
        var assemblyNames = new HashSet<string>(assemblyFilters.Where(filter => !filter.Contains('*')));
        var wildcardNames = assemblyFilters.Where(filter => filter.Contains('*')).ToArray();

        var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(assembly =>
            {
                var nameToMatch = assembly.GetName().Name;
                if (assemblyNames.Contains(nameToMatch)) return true;

                return wildcardNames.Any(wildcard => IsWildcardMatch(nameToMatch, wildcard));
            })
            .ToArray();

        return assemblies;
    }

    /// <summary>
    ///     Checks if a string matches a wildcard argument (using regex)
    /// </summary>
    private static bool IsWildcardMatch(string input, string wildcards)
    {
        return Regex.IsMatch(input, "^" + Regex.Escape(wildcards).Replace("\\*", ".*").Replace("\\?", ".") + "$",
            RegexOptions.IgnoreCase);
    }
}public static class GetTypes    {
    public static Type[] GetTypesImplementing<T>(params Assembly[] assemblies)
    {
        if (assemblies == null || assemblies.Length == 0)
            return new Type[0];

        var targetType = typeof(T);

        return assemblies
            .Where(assembly => !assembly.IsDynamic)
            .SelectMany(GetExportedTypes)
            .Where(type => !type.IsAbstract && !type.IsGenericTypeDefinition && targetType.IsAssignableFrom(type))
            .ToArray();
    }

    private static IEnumerable<Type> GetExportedTypes(Assembly assembly)
    {
        try
        {
            return assembly.GetExportedTypes();
        }
        catch (NotSupportedException)
        {
            // A type load exception would typically happen on an Anonymously Hosted DynamicMethods
            // Assembly and it would be safe to skip this exception.
            return Type.EmptyTypes;
        }
        catch (ReflectionTypeLoadException ex)
        {
            // Return the types that could be loaded. Types can contain null values.
            return ex.Types.Where(type => type != null);
        }
        catch (Exception ex)
        {
            // Throw a more descriptive message containing the name of the assembly.
            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture,
                "Unable to load types from assembly {0}. {1}", assembly.FullName, ex.Message), ex);
        }
    }
}
我在两个类中访问一个方法是_sitecoreContext.GetItem(Context.Site.ContentStartPath),另一个方法是_sitecoreContext.GetRootItem(),然后它开始抛出错误“{”服务已被释放,无法在_sitecoreContext.GetItem(Context.Site.ContentStartPath)中创建对象“}”,但正在为 _sitecoreContext.GetRootItem()

当我将AddTransient更新为AddSingleton时,这两种方法都会运行一段时间,但一段时间后,它开始给我空值_sitecoreContext

请帮帮我

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"><sitecore><services>
<configurator type="Habitat.Foundation.ORM.DI.RegisterContainer, Habitat.Foundation.ORM" />
</services>  </sitecore>
private readonly ISitecoreContext _sitecoreContext;

    public TestController(ISitecoreContext sitecoreContext)
    {
        _sitecoreContext = sitecoreContext;

    }