Доступ к сервису WCF внутри набора данных AccessContract? - PullRequest
0 голосов
/ 27 апреля 2011

G'day,

Я пытаюсь выяснить, как (если это возможно) получить доступ к объекту службы WCF из набора средств доступа для свойства datacontract.

Например:

class MyService:IMyService
{
...
public string SomeMethod(int property)
...
}

[DataContract]
class MyType
{
[DataMember]
public int MyProperty
{
  ...
  set
  {
    // Use a call to the already created WCF instance inside the set accessor
    _otherValue = WCFInstance.SomeMethod(value);
  }
}
...
}

Возможно, это не лучшая практика, но возможно ли это? Я могу создать новый экземпляр класса MyService, чтобы выполнить вызов в описанной выше ситуации, но это кажется пустой тратой, когда в памяти уже есть один экземпляр, обрабатывающий запрос WCF.

Любая помощь будет очень полезна. Любые вопросы или дополнительную информацию, пожалуйста, не стесняйтесь спрашивать.

Большое спасибо, Стив

Ответы [ 2 ]

3 голосов
/ 08 ноября 2012

У меня была похожая проблема.Мне нужна эта функциональность для выполнения «ленивой» загрузки при доступе клиента к некоторым свойствам.Когда ваш сервисный клиент использует ChannelFactory (из WCF), у вас должна быть ссылка на сборку, которая определяет SerivceContracts и OperationContracts.Затем вы можете легко реализовать метод создания канала обслуживания в той же сборке.

В сборке SerivceContract / DataContract:

public class ServiceFactory
{
    private static Dictionary<Type, object> srvs = new Dictionary<Type, object>();

    private ServiceFactory()
    {
    }

    public static T GetService<T>(string configName = null)
    {
        if (!srvs.ContainsKey(typeof(T)))
        {
            if (String.IsNullOrEmpty(configName))
                throw new Exception("configName must be provided by client");

            srvs.Add(typeof(T), new ChannelFactory<T>(configName).CreateChannel());
        }

        return (T)srvs[typeof(T)];
    }
}

[DataContract]
public class Customer
{
    [DataMember]
    public int ID { get; set; }

    public Address Address
    {
        get 
        {
            return ServiceFactory.GetService<IMyService>().GetAddressByCustomerID(ID);
        }            
    }
}

На стороне клиента:

var srv = ServiceFactory.GetService<IMyService>("MyServiceEndpointConfigName");

// get a Customer DataContract object
var cust = srv.GetCustomerByID(1);

// calls automaticly the GetAddressByCustomerID method
var Console.WriteLine(cust.Address.City);
1 голос
/ 27 апреля 2011

Хотя я в первую очередь не согласен с этим, интересно исследовать эту идею.

Принимая во внимание общую картину: экземпляры MyType будут создаваться на стороне сервера и на стороне клиента. Они либо будут явно созданы кодом, либо созданы, когда платформа WCF десериализует сообщение. Например, если ваша служба принимает в качестве параметра объект MyType , тогда ваш клиентский код должен будет создать экземпляр и передать его вызову WCF. На этом этапе платформа WCF будет сериализовать ее, вызывая все методы получения и записывая в XML, а затем структура WCF на стороне сервера создаст новую копию и вызовет все методы set во время десериализации.

На стороне сервера ваш недавно десериализованный экземпляр MyType может получить экземпляр службы с помощью следующего кода:

var serviceInstance = (MyService) OperationContext.Current.InstanceContext.GetServiceInstance()

(Я не знаю, сработает ли это, потому что заданные методы будут вызываться во время десериализации экземпляра MyType . Доступен ли текущий InstanceContext в этот момент?)

Но на стороне клиента контекст операции отсутствует, поэтому вы не можете вызвать этот код.

Вы можете просто проверить, является ли OperationContext.Current нулевым или нет. Или вы можете вручную закодировать определения интерфейса на стороне сервера и на стороне клиента, чтобы реализация MyType на сервере имела эту дополнительную логику установки, а реализация на клиенте - нет. Конечно, наличие двух соответствующих, но слегка отличающихся друг от друга определений интерфейса создает целый вопрос обслуживания.

Удачи, мне было бы интересно узнать, как устроено ваше приключение.

...