Skip to content
This repository has been archived by the owner on Feb 23, 2021. It is now read-only.

Commit

Permalink
More changes
Browse files Browse the repository at this point in the history
  • Loading branch information
ajaybhargavb committed Sep 22, 2016
1 parent a04832b commit 69f01f1
Showing 1 changed file with 42 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Razor.Compilation.TagHelpers;
using Microsoft.AspNetCore.Razor.Runtime.TagHelpers;
Expand All @@ -22,7 +23,7 @@ public class AssemblyTagHelperDescriptorResolver
private MethodInfo _populateMethod;

public AssemblyTagHelperDescriptorResolver()
: this(tagHelperTypeResolver: new TagHelperTypeResolver())
: this(new TagHelperTypeResolver())
{
}

Expand Down Expand Up @@ -58,41 +59,38 @@ public IEnumerable<TagHelperDescriptor> Resolve(string assemblyName, ErrorSink e
LoadMvcAssembly();
}

ITagHelperDescriptorResolver resolver;
if (_hasMvcAssembly)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<ITagHelperTypeResolver>(_tagHelperTypeResolver);
serviceCollection.AddSingleton<ITagHelperDescriptorFactory>(_tagHelperDescriptorFactory);

// Populate the service collection
_populateMethod.Invoke(_serviceCollectionProviderClassInstance, new object[] { serviceCollection, assemblyName });
_populateMethod.Invoke(
_serviceCollectionProviderClassInstance,
new object[] { serviceCollection, assemblyName });

var services = serviceCollection.BuildServiceProvider();
var tagHelperDescriptorResolver = services.GetRequiredService<ITagHelperDescriptorResolver>();

var directiveDescriptors = new TagHelperDirectiveDescriptor[]
{
new TagHelperDirectiveDescriptor
{
DirectiveText = $"*, {assemblyName}"
}
};
var context = new TagHelperDescriptorResolutionContext(directiveDescriptors, errorSink);
var descriptors = tagHelperDescriptorResolver.Resolve(context);

return descriptors;
resolver = services.GetRequiredService<ITagHelperDescriptorResolver>();
}

// MVC assembly does not exist. Fallback to resolving the descriptors manually.
var tagHelperTypes = GetTagHelperTypes(assemblyName, errorSink);
var tagHelperDescriptors = new List<TagHelperDescriptor>();
foreach (var tagHelperType in tagHelperTypes)
else
{
var descriptors = _tagHelperDescriptorFactory.CreateDescriptors(assemblyName, tagHelperType, errorSink);
tagHelperDescriptors.AddRange(descriptors);
// MVC assembly does not exist. Manually create the resolver.
resolver = new TagHelperDescriptorResolver(_tagHelperTypeResolver, _tagHelperDescriptorFactory);
}

return tagHelperDescriptors;
var directiveDescriptors = new[]
{
new TagHelperDirectiveDescriptor
{
DirectiveText = $"*, {assemblyName}"
}
};
var context = new TagHelperDescriptorResolutionContext(directiveDescriptors, errorSink);
var descriptors = resolver.Resolve(context);

return descriptors;
}

/// <summary>
Expand All @@ -105,20 +103,33 @@ protected virtual IEnumerable<Type> GetTagHelperTypes(string assemblyName, Error

private void LoadMvcAssembly()
{
const string namespaceName = "Microsoft.AspNetCore.Mvc";
const string typeName = "DesignTimeMvcServiceCollectionProvider";
const string assemblyName = "Microsoft.AspNetCore.Mvc";
const string methodName = "PopulateServiceCollection";

_loadedAssembly = true;

try
{
var assembly = Assembly.Load(new AssemblyName("Microsoft.AspNetCore.Mvc"));

var providerClass = assembly.GetType(
"Microsoft.AspNetCore.Mvc.DesignTimeMvcServiceCollectionProvider",
throwOnError: true);
var providerClass = Type.GetType($"{namespaceName}.{typeName}, {assemblyName}", throwOnError: true);

_serviceCollectionProviderClassInstance = Activator.CreateInstance(providerClass);
_populateMethod = providerClass.GetMethod(
"PopulateServiceCollection",
BindingFlags.Public | BindingFlags.Static);

// Get the method from the type
_populateMethod = providerClass.GetMethods(BindingFlags.Public | BindingFlags.Static)
.FirstOrDefault(methodInfo =>
{
if (string.Equals(methodName, methodInfo.Name, StringComparison.Ordinal)
&& methodInfo.ReturnParameter.ParameterType.Equals(typeof(void)))
{
var methodParams = methodInfo.GetParameters();
return methodParams.Length == 2
&& methodParams[0].ParameterType.Equals(typeof(IServiceCollection))
&& methodParams[1].ParameterType.Equals(typeof(string));
}
return false;
});

_hasMvcAssembly = true;
}
Expand Down

0 comments on commit 69f01f1

Please sign in to comment.