0

次のような問題があります。

public interface IBaseVMFactory
{
  public BaseVm Create(TransientDependency otherVM);
}

public class BaseVM
{
   BaseVM(ChildVM1 child1, ChildVM2 child2)
}

public class ChildVM1
{
   ChildVM1(TransientDependency otherVM)
}

すべてのビューモデル (..VM) は一時的である必要があります。そして、childVM1 が、ファクトリに与えられたものと同じ otherVM のインスタンスを取得する必要があります。

BaseVm を ScopedLifestyle として登録しようとしましたが、ファクトリを手動で実装し、スコープ内で解決するときにインスタンスを渡しました。それでも、解決時に otherVM の新しいインスタンスを取得します。

ここで明らかな何かが欠けていますか?

ケティル。

4

1 に答える 1

0

以下のコードを使用して、Windsor 3.2 で問題を再現してみました。

using System.Diagnostics;
using Castle.Facilities.TypedFactory;
using Castle.MicroKernel.Registration;
using Castle.Windsor;

namespace ConsoleApplication2
{
    public class SomeViewModel
    {
        public SomeViewModel(ISomeFactory factory)
        {
            var dependency1 = factory.CreateSomeDependency();
            var dependency2 = factory.CreateSomeDependency();

            Debug.Assert(dependency1 != dependency2);
            Debug.Assert(dependency1.Dep == dependency2.Dep);
        }
    }

    public class SomeDependency
    {
        private readonly DepDep _dep;

        public SomeDependency(DepDep dep)
        {
            _dep = dep;
        }

        public DepDep Dep
        {
            get { return _dep; }
        }
    }

    public class DepDep
    {
    }

    public interface ISomeFactory
    {
        SomeDependency CreateSomeDependency();
    }

    class Program
    {
        static void Main(string[] args)
        {
            var container = new WindsorContainer();
            container.AddFacility<TypedFactoryFacility>();
            container.Register(
                Component.For<SomeViewModel>().LifestyleTransient(),
                Component.For<SomeDependency>().LifestyleTransient(),
                Component.For<DepDep>().LifestyleBoundTo<SomeViewModel>(),
                Component.For<ISomeFactory>().AsFactory().LifestyleTransient()
                );
            container.Resolve<SomeViewModel>();
        }
    }
}

驚いたことに、これはうまくいきます。そのため、ファクトリは、それが作成されたコンテキストの範囲を引き継いでいるようです。これがお役に立てば幸いです。

よろしく、マルウェイン。

于 2013-04-11T10:15:28.380 に答える