在我的项目中,我有一个服务类。
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需要某种构造函数。我不知道最佳做法是什么,也不知道如何实现这一目标。任何帮助表示赞赏。
答案 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实例是线程安全的。