2

そのため、私はNancy+TinyIoCを使用して小さなWebサービスを実行しています。これは機能します。次に、同じ依存関係のいくつかを必要とするQuartzジョブを作成する必要があります。理想的には、 Quartzチュートリアルで説明されているように、NancyのTinyIoCを使用してこれらを注入します。

Windsorを使用してこの例を見つけました。この例では、IoCコンテナに直接アクセスしますが、ナンシーでは、ここで尋ねられた同様の質問によると、これは大雑把で不要です。

私の質問は、これを行う正しい方法は何ですか?JobFactoryのコードは次のようになります。

public class MyJobFactory : IJobFactory
{
    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return (IJob) TinyIoCContainer.Current.Resolve(bundle.JobDetail.JobType);
    }
}

ただし、これは正しく挿入されたインスタンスを持つジョブを返すのではなく、依存関係の新しいインスタンスを持つジョブを返します。(これはシングルトンであると想定されているため、TinyIoCContainer.Currentによって返されるTinyIoCContainerは、ナンシーが使用するコンテナーと同じではないと私は信じています)。

更新
NancyBootstrapperを介してIoCコンテナを設定しています。

public class MyBootStrapper : DefaultNancyBootstrapper
{
    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        var push = new PushService();
        // object initialization and Event Registration snipped
        container.Register(cp);
    }
}
4

3 に答える 3

5

TinyIoCContainer.Currentによって返されるTinyIoCContainerは、ナンシーが使用するものと同じコンテナではないと私は信じています。

1つにまとめました:-).Currentは静的インスタンスであり、おそらくtinyioc.csファイルのナンシーバージョンから削除する必要があります。これは、ブートストラッパーが使用するインスタンスとは異なります。

どうしてもサービスロケーションを使用する必要があり、コンストラクタインジェクションを使用する方法がない場合は、ブートストラッパーのGetApplicationContainerメソッドをオーバーライドして、.Currentインスタンスを返すことができるため、ナンシーは代わりにそれを使用します。推奨するものではないため、デフォルトでは使用しません。

于 2012-10-12T13:37:32.100 に答える
0

アップデート

ごめんなさい。Quartzの仕事は別のプロジェクトにあり、ナンシーベースのWebサービスへの呼び出しをスケジュールするためにそれを使用していると思いました。クォーツの仕事はナンシープロジェクトのにあることを私は知っています。

私の元の答えは無視できると思います:-)

元の回答

それらの依存関係をシングルトンとして登録するように指定しますか?あなたはこのようにそれを行うことができます:

TinyIoCContainer.Current.Register<SomeType>().AsSingleton();

機能を使用していて、AutoRegister使用する依存関係がインターフェイスや抽象クラスタイプではなく、すべてGetDefaultObjectFactoryの依存関係をシングルトンにしたい場合は、TinyIoCでを変更する必要があります。

デフォルトは次のようになります。

private ObjectFactoryBase GetDefaultObjectFactory(Type registerType, Type registerImplementation)
{
    //#if NETFX_CORE
    //if (registerType.GetTypeInfo().IsInterface() || registerType.GetTypeInfo().IsAbstract())
    //#else
    if (registerType.IsInterface() || registerType.IsAbstract())
    //#endif
        return new SingletonFactory(registerType, registerImplementation);

    return new MultiInstanceFactory(registerType, registerImplementation);
}

ご覧のとおり、を使用して解決されるインターフェイスの依存関係と抽象クラスの依存関係を登録しますSingletonFactory。それ以外はすべて、を使用して登録されますMultiInstanceFactory

次に、これに変更できます。

private ObjectFactoryBase GetDefaultObjectFactory(Type registerType, Type registerImplementation)
{
    return new SingletonFactory(registerType, registerImplementation);
}
于 2012-10-12T12:15:52.060 に答える
0

@Stevenの情報は素晴らしいと思います。次に、BootstrapIoCを静的プロパティとして公開する別のソリューションを取得します。

public class Bootstrapper : DefaultNancyBootstrapper
{
    public static TinyIoCContainer Container { get; private set; }

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        Container = container;
    }
}

使用時...

Bootstrapper.Container.Resolve(...)
于 2015-02-20T18:34:30.967 に答える