4

インスタンスを返す前に、ファクトリ クラスで少し作業を行う必要があるため、次のようなファクトリ メソッドがあります。

public Foo Create(string bar, IEnumerable<SomeMetaData> metaData)
{
    var meta = new ObservableCollection<AnotherType>(
                        metaData.Select(e => new AnotherType { ... }).ToList());

    return Create(new ConstructorArgument("bar", bar),
                  new ConstructorArgument("metaData", meta));
}

具体的なファクトリ クラスは、ベース ファクトリから派生します。これにより、実際の配線は省かれますIResolutionRoot

public abstract class FactoryBase<T> where T : class
{
    private IResolutionRoot _resolutionRoot;
    protected FactoryBase(IResolutionRoot resolutionRoot)
    {
        _resolutionRoot = resolutionRoot;
    }

    protected T Create(params IParameter[] parameters)
    {
        return _resolutionRoot.Get<T>(parameters);
    }
}

(誰かがコメントしたい場合は、この抽象クラスについて CodeReview に質問があります: https://codereview.stackexchange.com/questions/25038/are-there-side-effects-to-having-a-generic-ninject -工場)

問題は、NinjectModule で、特定の具象FooFactoryクラスを使用するように Ninject に指示する方法がわからないことです。

Bind<IFooFactory>().ToFactory(); // uses an abstract factory that doesn't do what I need
Bind<IFooFactory>().ToFactory<FooFactory>(); // doesn't build

私が必要としているのは次のようなものだと思います:

Bind<IFooFactory>().ToFactory<FooFactory>(Func<FooFactoryInstanceProvider>);

これを提供するにはどうすればよいInstanceProviderですか? おそらくそれは私の誤解にすぎませんが、 http: //www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/ はこれについて曖昧すぎるFunc<T>と思います。

私はこれを思いついた:

public class FooFactoryInstanceProvider : StandardInstanceProvider
{
    protected override Type GetType(MethodInfo methodInfo, object[] arguments)
    {
        return typeof(FooFactory);
    }
}

ここまでは順調ですね?次のステップは何ですか?

4

1 に答える 1