1

私のプロジェクトには、サービス クラスがあります。

class KLAService : IKLAService
{
    CentralLogic centralLogic;

    .....
}

ServiceHostこのクラスを使用して、次のように設定しました。

centralLogic = new CentralLogic();

ServiceHost host = new ServiceHost(typeof(KLAService));
using (host)
{ 
    host.Open();

    Application app = new Application();
    app.Run(new ConfigurationWPF.MainWindow(centralLogic));

    host.Close();
}

明らかになったかもしれませんが、CentralLogicクラスのインスタンスを 1 つ作成します。このインスタンスは UI だけでなく、ホストでも使用され、ソリューション内の他のものを管理します。

私が今抱えている問題は、centralLogic-変数を -class KLAService(またはhost) に設定することです。これを行う方法がわかりません。プラグイン Ninject と、サービスにオブジェクトを挿入する方法について読んだことがありますが、それは私のリーグ外であり、簡単な方法があると思わずにはいられません。

どうすれば自分の目標を最もよく達成できますか?

編集: 提案された別の解決策は、ServiceHost を開始し、CentralLogicその逆ではなく、そこで作成することでした。これは、ServiceHost に何らかのコンストラクターが必要であることを意味します。ベストプラクティスが何であるか、これを達成する方法がわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

1

CentralLogic最も簡単な解決策は、クラスのシングルトンを作成することです。

依存性注入を行いたい場合は、structuremapをお勧めします。nuget を使用して非常に簡単にセットアップできます。KLAService

これを設定し、ローカル オブジェクトを他のクラスに挿入する方法を示すコンソール アプリを次に示します。

class KLAService : IKLAService
{
    // Constructor injection
    public KLAService(ICentralLogic logic)
    {
        Console.WriteLine(logic.Value);
    }

    // Manual instance creation
    internal void PrintLogicValue()
    {
        var logic = ObjectFactory.Container.GetInstance<ICentralLogic>();
        Console.WriteLine(logic.Value);
    }
}

interface IKLAService
{
}

class CentralLogic : ICentralLogic
{
    public int Value { get; set; }

    public CentralLogic()
    {
        Value = 12345;
    }
}

interface ICentralLogic
{
    int Value { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var logic = new CentralLogic();

        ObjectFactory.Initialize(x => x.Scan(scan => scan.TheCallingAssembly()));
        ObjectFactory.Container.Configure(x => x.For<ICentralLogic>().Use(y => logic));

        var service = ObjectFactory.Container.GetInstance<KLAService>();
        service.PrintLogicValue();

        Console.ReadKey();
    }
}

コードが呼び出すとvar service = ObjectFactory.Container.GetInstance<KLAService>();、コンストラクターは型のオブジェクトを期待しICentralLogic、インジェクターは構成されたlogicオブジェクトを提供します。

ICentralLogicまたは、 で構成されたオブジェクトを手動で取得することもできますObjectFactory.Container.GetInstance<ICentralLogic>();

于 2013-06-03T07:55:05.740 に答える
1

依存性注入が本当に必要だとは思いません。単一のインスタンスがあるためCentralLogic、事実上シングルトンです。ここでシングルトンパターンについて読んでください。

シングルトンパターンを実装できますCentralLogic

public sealed class CentralLogic
{
    private static readonly Lazy<CentralLogic> lazy =
        new Lazy<CentralLogic>(() => new CentralLogic());

    public static CentralLogic Instance { get { return lazy.Value; } }

    private CentralLogic()
    {
    }
}

次に、Service Impl のコンストラクター (および UI) で、次のようにインスタンスを取得します。

class KLAService : IKLAService
{
    CentralLogic m_centralLogic;

    public KLAService() 
    {
       m_centralLogic = CentralLogic.Instance;
       ....
    }
}

ServiceHost に何も渡す必要はありません。

ここで最も重要なことは、CentralLogic のインスタンスがスレッド セーフであることを確認することです。

于 2013-06-03T09:03:40.503 に答える