2

Onion Architecture とWindows Forms UI レイヤーを組み合わせているときに問題が発生しました。問題は、IoC 構成メソッドがヒットしないことです。IoC セットアップは、依存関係解決アセンブリで行われます。

Project.Core
Project.Infrastructure
Project.UI                   <- Startup project 
Project.DependencyResolution <- IoC configuration

そして、UI レイヤーが .NET 以外に依存しないようにしたいと思いProject.Coreます。

このアーキテクチャを使用した Web プロジェクトでは、WebActivatorEx と OutputTo を使用して IoC をブートストラップしました。私はよく知っているので、ここでも同じものを使用することにしましたが、期待どおりに動作しません。私が問題なのか Windows フォームが問題なのかわからないので、私のセットアップは次のとおりです。

Project.DependencyResolution で:

[assembly: WebActivatorEx.PreApplicationStartMethod(
    typeof (IocConfig), "RegisterDependencies")]

public class IocConfig
{
    public static void RegisterDependencies() {
        // this is never executed
    }
}

OutputTo の OutputTargets.txt:

..\Project.UI\bin    

Project.UI で:

static class Program
{
    static void Main() {
        WebActivatorEx.ActivationManager.RunPreStartMethods();
        Application.Run(...);
    }
}

OutputToDependencyResolution'sは DLL ファイルをUi'sbin に正しくコピーしますが、IocConfig.RegisterDependencies実行されません。

では、Windows フォーム プロジェクトがスタートアップ プロジェクトである独自のアセンブリから IoC をセットアップするにはどうすればよいでしょうか。

4

1 に答える 1

1

これを WebActivatorEx 2.0.0.5 (NuGet の最新版) でテストしました。正常に動作します。でコンソールに何かを出力して確認しましたRegisterDependencies

いずれにせよ、それが WinForms アプリケーションであることとは何の関係もありません (コンソール アプリである可能性もありますが、それでも動作するはずです)。

今私の頭をよぎる唯一のことは、UI アセンブリが他のアセンブリ (WebActivatorEx を含む) の隣にないということです。ソース コードを確認したところ、すべての DLL を検索する場所であるため、そこにあることに依存しています。アセンブリが本来あるべき場所にあることを確認できますか?

さらに、WebActivatorEx のソース コードには次のようなものがあります。

            try
            {
                return assembly.GetCustomAttributes(
                    typeof(T),
                    inherit: false).OfType<T>();
            }
            catch
            {
                // In some very odd (and not well understood) cases, GetCustomAttributes throws. Just ignore it.
                // See https://github.com/davidebbo/WebActivator/issues/12 for details
                return Enumerable.Empty<T>();
            }

そのため、原因がすぐに見つからない場合は、WebActivatorEx ソース コードを取得し、それを使用して動作をデバッグすることをお勧めします。また、読み込まれるアセンブリを確認することもできますActivationManager.RunPreStartMethods(実際にはプライベートな静的Assembliesプロパティです)。

于 2014-07-29T00:05:03.060 に答える