2013-05-31 55 views
1

在我的項目中,我有一個服務類。從ServiceHost設置變量

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類的一個實例。這個實例在用戶界面中使用,但也在主機中用於管理我的解決方案中的其他內容。

我現在遇到的問題是在KLAService-classes(或host)中設置centralLogic-變量。我不知道該怎麼做。我已經閱讀了關於Ninject的插件以及如何在服務中注入對象,但這是我的聯盟,我不禁想到有一種簡單的方法。

我怎樣才能達到我最好的目標?

編輯:提出的另一種解決方案是啓動ServiceHost並讓CentralLogic在那裏創建而不是其他方式。這意味着ServiceHost需要某種構造函數。我不知道最佳做法是什麼,也不知道如何實現。任何幫助表示讚賞。

+0

可能的重複http://stackoverflow.com/questions/2454850/how-do-i-pass-values-to-the-constructor-on-my-wcf-service – haim770

回答

1

我不認爲你真的需要依賴注入。由於CentralLogic只有一個實例,因此它實際上是一個單例。閱讀關於單身模式here

您可以在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() 
    { 
    } 
} 

然後在服務默認地將Impl的構造器實現單件模式(以及UI),你得到的情況下,這種方式:

class KLAService : IKLAService 
{ 
    CentralLogic m_centralLogic; 

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

沒有需要將任何東西傳遞給ServiceHost。

這裏最重要的是確保您的CentralLogic實例是線程安全的。

+0

這更像是它,我不明白爲什麼一切都如此困難。在'ServiceHost'中,我怎樣才能調用構造函數?我遇到了麻煩。另一方面,我並不需要一個聲明'm_centralLogic'的構造函數,但可以使用例如'CentralLogic.Instance.GetUsers();'。讓我試試這個。 – Joetjah

+0

你應該沒有'KLAService'構造函數的問題 - 畢竟它是默認的(無參數)構造函數 - WCF將處理它。是的,您可以使用''CentralLogic.Instance.Methods()' - 請確保'CentralLogic'類的所有方法和屬性在實現時都是線程安全的。 – YK1

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對象。

或者,您可以使用ObjectFactory.Container.GetInstance<ICentralLogic>();手動獲取ICentralLogic的配置對象。

+0

這是有道理的。如何在這裏創建'ServiceHost'? – Joetjah

+0

最簡單的方法是用'new ServiceHost(ObjectFactory.Container.GetInstance ())' – Candide

+0

'更改'new ServiceHost(typeof(KLAService))'好吧,讓我試試這個。你能向我解釋你對兩個「ObjectFactory」行做了什麼?之後,你聲明'var service'。我可以在'new ServiceHost ...'行中使用'service',對嗎? – Joetjah