10
votes

Contrôleurs MVC 6 RC2 dans une autre assemblée

dans mvc 6 rc1 Nous avons utilisé l'interface isiemlbyprovider code> pour enregistrer les assemblages découverts à l'exécution et injecter des types de contrôleur supplémentaires, dans un Fashion à ce message .. Maintenant, avec RC2, le IASSEMblyProvider code> a été supprimé et a changé pour (voir référence) .

Notre version Framework est actuellement Net46 CODE>. P>

Étant donné que la mise à niveau Nos contrôleurs dans des assemblages externes (non référencés) renvoie le statut d'un 404 code>. P>

Nous avons essayé d'ajouter manuellement le contrôleur aux contrôleurs enregistrés via le ApplicationPartManager Code>. p> xxx pré>

et ... p> xxx pré>

maintenant Les assemblages sont définitivement chargés dans le appdomain code> Comme notre système d'injection de dépendance consiste à trouver et à remplir des services pour d'autres éléments des assemblys externes. P>

avec nos implémentations précédentes, cela a fonctionné bien en utilisant le IASSEMblyProvider p>

public class ModuleAwareAssemblyProvider : IAssemblyProvider
{
    private readonly DefaultAssemblyProvider _defaultProvider;

    public ModuleAwareAssemblyProvider(DefaultAssemblyProvider defaultProvider)
    {
        _defaultProvider = defaultProvider;
    }

    public IEnumerable<Assembly> CandidateAssemblies
    {
        get
        {
            return _defaultProvider.CandidateAssemblies.Concat(ModulesManager.Assemblies).Distinct();
        }
    }
}


0 commentaires

3 Réponses :


13
votes

Après quelques dépenses de temps travaillant avec le contrôleur code> directement sans résultat, il était temps de revenir à des bases.

Fondamentalement au démarrage des contrôleurs d'application sont enregistrés dans Strong> Le conteneur Controller Feature pas de STRAND> La fonction de contrôleur. Ceci est la clé, car vous devez obtenir les contrôleurs enregistrés. P>

Je parcourais le GitHUB Responsentiel pour RC2 et est tombé sur le ControllerFeatureProvider code> . Comme indiqué. P>

var mvcBuilder = services.AddMvc();
foreach(var module in ModulesManager.ReferencedModules)
{
    mvcBuilder.AddApplicationPart(module.ReferencedAssembly);
}


4 commentaires

Je suis un peu confus sur votre classe modulemanager . Est-ce modulemanager ou modulesManager ? De toute façon, je ne peux pas sembler trouver une référence à une documentation ou de code source. Comment puis-je continuer à le faire et à entrer dans le référencéModules ?


Le modulesManager est une classe personnalisée (notre propre classe) utilisée pour rechercher des modules basés sur des chemins spécifiques et des versions référencées. Vous devriez être capable de mettre facilement en œuvre votre propre version comme vous le voyez.


Merci pour la bonne explication. PreservecompilationContext Est-ce que l'astuce m'a fait. Je ne peux pas croire à quel point l'ensemble du noyau ASP.NET est gravement documenté. Je comprends sa nouvelle documentation mais une documentation plus avancée serait la bienvenue.


Merci pour cette recherche, c'est exactement ce que j'avais besoin de savoir pour une situation similaire.



1
votes

Il suffit d'ajouter le démarrage -> Configurevices

services.AddMvc()
.AddApplicationPart(typeof(OtherAssemblyController).GetTypeInfo().Assembly)
.AddControllersAsServices();


1 commentaires

L'autre accessoire d'évaluation est dans le projet dépendant, je ne peux pas y ajouter de référence. Alors qu'est-ce que je peux faire?



0
votes

J'ai utilisé un élément d'application en utilisant la méthode d'extension du générateur suivant pour mettre en œuvre la fonctionnalité des plugins. J'espère que cela serait utile pour quelqu'un.

ASP.NET CORE 1.1 H2>
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();

        environment = env;
    }

    public IHostingEnvironment environment { get; set; }
    public IConfigurationRoot Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        var builder = services.AddMvc()
            .AddFeaturesSupport(this.Configuration, this.environment);
    }


0 commentaires