从ServiceHost设置变量

时间:2013-05-31 07:17:56

标签: c# wcf web-services 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类的一个实例。这个实例在UI中使用,但也在主机中用于管理我的解决方案中的其他内容。

我现在遇到的问题是在centralLogic - 类(或KLAService)中设置host - 变量。我不知道该怎么做。我已经阅读了插件Ninject以及如何在服务中注入对象,但这已经超出了我的联盟,我不禁想到有一个简单的方法。

我怎样才能最好地实现目标?

编辑:提出的另一个解决方案是启动ServiceHost并让CentralLogic在那里创建,而不是相反。这意味着ServiceHost需要某种构造函数。我不知道最佳做法是什么,也不知道如何实现这一目标。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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>();的已配置对象。

答案 1 :(得分: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()
    {
    }
}

然后在Service Impl的构造函数(以及UI)中,以这种方式获取实例:

class KLAService : IKLAService
{
    CentralLogic m_centralLogic;

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

无需向ServiceHost传递任何内容。

对您来说最重要的是确保您的CentralLogic实例是线程安全的。