Jon McKee
Если у вас есть общие данные между логически различными наборами операций, как правило, гораздо проще реализовать несколько контрактов на одной службе, чем реализовать пользовательский ServiceHost
который поддерживает инъекцию зависимостей. Особенно если вы новичок в WCF. Распространенным шаблоном является использование частичных классов, подобных этому:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)]
partial class DownloadService : IDownload
{
//Various download function like Add, Remove, Start, Stop, etc. go here
}
partial class DownloadService : ISettings
{
//Settings functions related to download functionality go here
}
[ServiceContract(SessionMode = SessionMode.Allowed)]
interface IDownload
{
[OperationContract(IsOneWay = true)]
void AddDownload(Download download);
//Then whatever other functions to download you use
}
[ServiceContract(SessionMode = SessionMode.Allowed)]
interface ISettings
{
[OperationContract(IsOneWay = true)]
void SaveSettings();
//Other functions for settings like Add, Remove, Load, etc.
}
[DataContract]
struct Download
{
[DataMember]
public string Name {get; private set;}
[DataMember]
public int Packet {get; private set;}
public Download(string name, int packet)
{
Name = name;
Packet = packet;
}
}
Таким образом, в данном примере этот сервис используется для загрузки откуда-то. Вам также нужны различные настройки, которые позволят вам контролировать, как
DownloadService
функции. Ну, это, очевидно, потребует некоторых общих данных между настройками и
DownloadService
Быстрый и простой способ сделать это - просто объединить обе функции в один сервис и предоставить несколько контрактов-один для загрузки, а другой для настройки. Более продвинутое решение, которое больше соответствует
ТВЕРДЫЙ[
^] принципы заключались бы в том, чтобы вывести свои собственные
ServiceHost
класс, который вводит общую зависимость в экземпляры службы. У меня есть совет / трюк
здесь[
^] это может показать вам, как это сделать, но я бы придерживался простых решений во время обучения :)
Надеюсь, это помогло!