5

これについて頭を悩ませても無駄です。誰か助けてくれるのでしょうか?

すぐに答えが得られると確信している本当にイライラするキャストの問題を取得しますが、おそらくジェネリック型の推論などについての私の理解が限られているために起こっているだけです。

前もって感謝します!

シナリオは、ウィザード サイトの多数の「ステップ」ビューモデルです。それぞれの Builder クラスを作成し、ファクトリを使用して、返信されたステップの特定のビルダーを取得します。これは IStepViewModel のコレクションです。

public interface IStepViewModelBuilderFactory
{
    IStepModelBuilder<T> Create<T>(T stepViewModel) where T : IStepViewModel;
    void Release<T>(IStepModelBuilder<T> stepViewModelBuilder) where T : IStepViewModel;
}

public interface IStepViewModel
{
}

public interface IStepModelBuilder<TStepViewModel> : IModelBuilder<TStepViewModel> where TStepViewModel : IStepViewModel
{
}

public class SpecificViewModelBuilder : IStepModelBuilder<SpecificStepViewModel>
{
}

public class SpecificStepViewModel: StepViewModel
{
}

public abstract class StepViewModel : IStepViewModel
{
}

失敗したテスト!

[Test]
public void TestResolution()
{
    var factory = this.container.Resolve<IStepViewModelBuilderFactory>();

    IStepViewModel viewModel = new SpecificStepViewModel();

    var builder = factory.Create(viewModel); // Here

    Assert.That(builder, Is.Not.Null);
}

問題!

タイプ 'Company.Namespace.SpecificViewModelBuilder' のオブジェクトをタイプ 'Company.Namespace.Builders.IStepModelBuilder`1[Company.Namespace.IStepViewModel]' にキャストできません。

Castle.Windsor を使用して次のようにファクトリ Impl

public class StepViewModelSelector : DefaultTypedFactoryComponentSelector
{        
    protected override Type GetComponentType(System.Reflection.MethodInfo method, object[] arguments)
    {
        var arg = arguments[0].GetType();
        var specType = typeof(IModelBuilder<>).MakeGenericType(arg);
        return specType;
    }
}

これの登録:

container.AddFacility<TypedFactoryFacility>();

     ....

    container
        .Register(
            Classes
                .FromAssemblyContaining<StepViewModelSelector>()
                .BasedOn<StepViewModelSelector>());

    container
        .Register(
            Component
                .For<IStepViewModelBuilderFactory>()
                .AsFactory(c => c.SelectedWith<StepViewModelSelector>()));

スタックトレース:

System.InvalidCastException はユーザー コード
HResult=-2147467262 によって処理されませんでした。Source=DynamicProxyGenAssembly2 StackTrace: Castle.Proxies.IStepViewModelBuilderFactoryProxy.Create[T](T stepViewModel) at Tests.Infrastructure.ViewModelBuilderFactoryTests.TestResolution() c:\Project\Infrastructure\ViewModelBuilderFactoryTests.cs:line 61
InnerException:

編集:IModelBuilder<T>インターフェース

public interface IModelBuilder<TViewModel>
{
    TViewModel Build();
    TViewModel Rebuild(TViewModel model);
}
4

2 に答える 2