4

Simple InjectorをIocツールとして使用して、asp.netmvc4サイトを開発しています。それはプラグ可能なアーキテクチャになります。一部のコントローラーとビューは別のアセンブリ(別のmvc4アプリケーション、Plugin.Web.dll)にあります。そして、メインアプリケーションから、プラグインをロードするPlugin.Web.dllのパスを知っています。

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

container.RegisterMvcAttributeFilterProvider();

container.Options.AllowOverridingRegistrations = true;

var appPath = AppDomain.CurrentDomain.BaseDirectory;

string[] files = Directory.GetFiles(appPath + "\\Plugins", "*",
    SearchOption.AllDirectories);

foreach (var fileName in files)
{
    Console.WriteLine(fileName);

    var assembly = Assembly.LoadFrom(fileName);

    container.RegisterMvcControllers(assembly);

    var controllerTypes =
        from type in assembly.GetExportedTypes()
        where type.Name.EndsWith("Controller",
            StringComparison.Ordinal)
        where typeof(IController).IsAssignableFrom(type)
        where !type.IsAbstract
        select type;

    // Instead of verify:
    foreach (var type in controllerTypes)
    {
        container.GetInstance(type);
    }
}            

container.Options.AllowOverridingRegistrations = false;       

container.Verify();

DependencyResolver.SetResolver(
    new SimpleInjectorDependencyResolver(container));

エラーは発生しません。

しかし、このクリックをクリックすると、次のように表示されます。

@Html.ActionLink("plugin page","PluginPage","Plugin")

'リソースが見つかりません。、http404'

前もって感謝します

4

1 に答える 1

5

あなたの質問は現時点では少し漠然としているため、さらに調査を行う必要があると思いますが、ここにいくつかの指針があります。

System.Web.Compilation.BuildManager.GetReferencedAssemblies()プラグイン アセンブリが返されるかどうかを確認します。MVCは、そのメソッドから返されたすべてのアセンブリで型をDefaultControllerFactory検索します。Controllerプラグイン フォルダを /bin ディレクトリ内に配置することをお勧めします。私が間違っていなければGetReferencedAssemblies()、/bin のサブディレクトリも調べます。プラグインをより動的にロードする必要がある場合は、おそらくカスタム コントローラー ファクトリを作成する必要があります。

この記事も参照してください。BuildManager にプラグイン アセンブリを強制的に認識させる方法が説明されています。

構成が複雑すぎるようです。次の構成でも同様にうまくいくはずです。

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

container.RegisterMvcAttributeFilterProvider();

var appPath = AppDomain.CurrentDomain.BaseDirectory;

string[] files = Directory.GetFiles(appPath + "\\bin\\Plugins", "*",
    SearchOption.AllDirectories);

container.RegisterMvcControllers(
    from fileName in files
    select Assembly.LoadFrom(fileName)
);    

container.Verify();

コンテナーの構成を照会して、その内容を確認できます。たとえば、これはすべての登録済みコントローラーを照会します。

var registeredControllerTypes = (
    from registration in container.GetCurrentRegistrations()
    where typeof(IController).IsAssignableFrom(registration.ServiceType)
    select registration.ServiceType)
    .ToArray();
于 2013-01-21T11:46:43.863 に答える