在我的项目中,我有一个服务类。
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中使用,但也在主机中用来管理我的解决方案中的其他内容。
我现在遇到的问题是,在KLAService-class (或host)中设置centralLogic-variable。我不知道该怎么做。我读过关于插件Ninject和如何在服务中注入对象的文章,但这超出了我的能力范围,我不禁认为有一种简单的方法。
我怎样才能达到最好的目标?
编辑:另一个建议的解决方案是启动ServiceHost并让CentralLogic在那里创建,而不是相反。这意味着ServiceHost需要某种构造函数。我不知道最佳实践是什么,也不知道如何实现这一点。任何帮助都是非常感谢的。
发布于 2013-06-03 17:03:41
我不认为你真的需要依赖注入。由于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的实例是线程安全的。
发布于 2013-06-03 15:55:06
最简单的解决方案是为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的配置对象。
https://stackoverflow.com/questions/16851797
复制相似问题