プロジェクトで 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>();