Создание единой точки входа в службу WCF: нужен единый подход для возврата объектов и коллекций

Тема говорит сама за себя: я создаю безопасную универсальную оболочку для прозрачного доступа к службе WCF.

Немного предыстория:

я создал аналогичное определение бизнес-классов как на сервере, так и на клиенте. На стороне сервера содержится фактическая логика, а на стороне клиента - только определения методов. Кроме того, классы на стороне клиента являются производными от SecureFactory, который реализует метод Call. Тело каждого метода каждого производного класса содержит только вызов метода Call. Этот метод Call отвечает за вызов серверной службы, передавая такие вещи, как тип бизнес-класса и какой из его методов вызывать для выполнения запрошенной операции. Этот подход разработан для упрощения проверок безопасности путем ограничения передачи информации о безопасности только между SecureFactory и серверной службой. Есть множество других преимуществ, о которых вы в большинстве своем уже знаете.

Теперь вот проблема: я застрял в том, как вернуть объекты (особенно массивы объектов) из метода Server to Call? Сервер может вернуть один бизнес-объект (примененный DataContract), а также список таких объектов. Поскольку это общий подход, у меня есть только Object, который будет использоваться в качестве возвращаемого типа. Ниже приведен метод Call

public object Call(params object[] parameters)
        {
            var mb = (new StackFrame(1).GetMethod());
                        using (Proxy.ServerClient server = new Security.BO.Proxy.ServerClient())
            {
                try
                {
                    if (((MethodInfo)mb).ReturnType.IsGenericType)
                    {
                        var response = server.InvokeForList(SecurityManager.Current.SID, SecurityManager.Current.Token, mb.DeclaringType.ToString(), mb.Name, parameters);
                        return  response.Result.ToList();
                    }
                    else
                    {
                        var response = server.Invoke(SecurityManager.Current.SID, SecurityManager.Current.Token, mb.DeclaringType.ToString(), mb.Name, parameters);
                        return response.Result;
                }
                        }
               catch (Exception ex)
                {
                    System.Diagnostics.Debugger.Break();
                }
                            }

            return null;
                    }

server methods:

public CollectionResponse InvokeForList(string SID, string token, string type, string method, object[] parameters)
        {
            // Validation here
            var t = assemblyBO.GetType(type, true);
            object BO =  Activator.CreateInstance(t);
            var mi = t.GetMethod(method);
            if (mi == null)
                throw new MethodNotImplementedException("Method " + method + " could not be found on type " + t.ToString());

            object res = mi.Invoke(BO, parameters);
// Convert list to t[]
            object list = res.GetType().GetMethod("ToArray").Invoke(res, new object[0]);
// Error here! cannot convert t[] into object[]
            return new CollectionResponse((object[])list); 
            }

The other method Invoke(...) is similar accept it returns Response object instead of CollectionResponse.


Here's the CollectionResponse class: (Response is similar:just it takes only one object)

[DataContract]
    public class CollectionResponse
    {

        [DataMember]
       private Object[] _result;
        public Object[] Result
        {
            get
            {
                return _result;
            }
        }

        public CollectionResponse(Object[] result)
        {
            this._result = result;
        }

    }

. Первоначально я думал иметь только один вызов для обоих списков и синглтона, но потерпел неудачу с сообщением «Соединение было неожиданно закрыто». все же я не могу этого добиться - как мне преобразовать T [] в object [].

Есть ли у вас какие-нибудь предложения по его улучшению или какой-либо другой способ добиться того же?

Спасибо

1
задан Varun 10 September 2010 в 12:08
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: