3

プロジェクトで Unity 2.0 を使用しており、Parallel.ForEach コード ブロック内で同時に多くのファイルを読み取っています。

Parallel.ForEach(files, currentFile =>
{
    using(IMsBuildProjectLoader msBuildProject = Container.Resolve<IMsBuildProjectLoader>(new ParameterOverride("projectFileName", currentFile)))
    {
        // file processing
    }
}

Resolve(new ParameterOverride("projectFileName", currentFile) 関数は、ResolutionFailedException をスローすることがあります。

ResolutionFailedException: Resolution of the dependency failed, 
type = "Porthus.Build.Common.Interfaces.IMsBuildProjectLoader", name = "(none)". 
Exception occurred while: Calling constructor XXX.Build.Common.Types.MsBuildProjectLoader(System.String projectFileName). 
Exception is: ArgumentException - Item has already been added. Key in dictionary: 'xxx'  Key being added: 'xxx'

これは、同じファイルが同時にロードされた場合です。Resolve 関数は、同じパラメータを持つ 2 つの IMsBuildProjectLoader インスタンスを同時に作成しています。files.Distinct() フィルターでは解決できません。上記のコードは、私の問題を説明するためのコード例にすぎません。

問題は次のとおりです。スレッドセーフな UnityContainer.Resolve 関数を実装する方法は? Unity拡張クラスを使用してそれを行うことは可能ですか?

IMsBuildProjectLoader :

public interface IMsBuildProjectLoader : IDisposable
{
}

MsBuildProjectLoader :

public class MsBuildProjectLoader : Project, IMsBuildProjectLoader
{
    public MsBuildProjectLoader(string projectFileName)
        : base()
    {
        // Load the contents of the specified project file.
        Load(projectFileName);
    }
}

MsBuildProjectLoader は次のように登録されます。

container.RegisterType<IMsBuildProjectLoader, MsBuildProjectLoader>();
4

1 に答える 1