Ошибки в моем родовом классе при попытке передать интерфейс в конструкторе - PullRequest
0 голосов
/ 26 сентября 2019

Здесь у меня есть 2 метода из 15+, которые вызывают веб-службу SOAP

       public async void CallWebServiceA() {
            var client = new WebServiceWRGClient();
            var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
            binding.MaxReceivedMessageSize = Int32.MaxValue;
            binding.MaxBufferSize = Int32.MaxValue;
            var endpoint = new EndpointAddress("https://trustonline.delawarecpf.com/tows/webservicewrg.svc"); 
            var channelFactory = new ChannelFactory<WebServiceWRG>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            var user = new GRACE_GRACES.User();
            user.UserName = await webService.EncryptValueAsync("username");
            user.Password = await webService.EncryptValueAsync("password12345");
            var response = await client.ClaimSearchAsync(user, "", "", 12345, GRACE_GRACES.statuscode.NotSet, "");
       }

       public async void CallWebServiceB() {
            var client = new WebServiceAWIClient();
            var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
            binding.MaxReceivedMessageSize = Int32.MaxValue;
            binding.MaxBufferSize = Int32.MaxValue;
            var endpoint = new EndpointAddress("https://trustonline.delawarecpf.com/tows/webserviceawi.svc"); 
            var channelFactory = new ChannelFactory<WebServiceAWI>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            var user = new ARM_ARMS.User();
            user.UserName = await webService.EncryptValueAsync("username");
            user.Password = await webService.EncryptValueAsync("password12345");
            var response = await client.ClaimSearchAsync(user, "", "", 12345, ARM_ARMS.statuscode.NotSet, "");
       }

У меня есть этот общий класс ниже, который я создал, поэтому мне не нужно создавать несколько избыточных методов для каждого извсе мои 15+ URL / веб-сервисов от одного и того же провайдера, но у меня есть некоторые ошибки при передаче второго параметра, который является интерфейсом (из ссылки на веб-сервис).

public class WebService<T1, T2, T3> {
    private T1 _client;
    private T2 _interface;
    private T3 _user;

    public WebService(T1 wsClient, T2 wsInterface, T3 wsUser) {
        _client = wsClient;
        _interface = wsInterface;
        _user = wsUser;
    }

    public void CallWebService(string url, string userName, string password) {
        var client = _client; 
        var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
        var endpoint = new EndpointAddress(url); 
        var channelFactory = new ChannelFactory<_interface>(binding, endpoint);  
        var webService = channelFactory.CreateChannel();
        var user = _user;
        user.UserName = webService.EncryptValue(userName);
        user.Password = webService.EncryptValue(password);
        var response = client.ClaimSearch(user, "", "", 12345, GraceStatuscode.NotSet, "");
    }

}

Я звонюкак это показано ниже, но интерфейсы WebServiceWRG и WebServiceAWI не распознаются в параметрах при создании экземпляра или в методе при создании нового экземпляра ChannelFactory.Я получаю красную строку, говорящую «тип имени пространства имен _interface не может быть найден», и в строке, где я создаю новый экземпляр класса, я получаю красную линию для каждого параметра интерфейса, говорящего «WebServiceWRG» - это тип, который не являетсядопустимо в данном контексте "

WebService someServiceA = new WebService(new WebServiceWRGClient(), WebServiceWRG, new GRACE_GRACES.User());
WebService someServiceB = new WebService(new WebServiceAWIClient(), WebServiceAWI, new ARM_ARMS.User());

ОБНОВЛЕНО Вот что я пробовал ниже, но все еще есть ошибки: user.UserName = webService.EncryptValue (userName);// TTwo не содержит def для 'UserName', T не содержит def для EncryptValue

   public class Test {
        public void TestWebService() {
            var ws = new WebService<WebServiceWRG>();
            ws.SearchClaim(new WebServiceWRGClient(), new GraceUser(), "url", "userName", "password");
        }
    }

    public class WebService<T> { 
        public void SearchClaim<TOne, TTwo>(TOne entity1, TTwo entity2, string url, string userName, string password) 
            where TOne : class
            where TTwo : class
        {
            var client = entity1;
            var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
            var endpoint = new EndpointAddress(url);
            var channelFactory = new ChannelFactory<T>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            var user = entity2;
            user.UserName = webService.EncryptValue(userName); // username not found, encryptvalue not found
            user.Password = webService.EncryptValue(password); // passwordnot found, encryptvalue not found
            var response = client.ClaimSearch(user, "", "", 12345, GraceStatuscode.NotSet, ""); // claimsearch not found
        }
    }

1 Ответ

1 голос
/ 26 сентября 2019

Давайте сначала признаем, что изменения, которые вы делаете, являются правильными.Работа во избежание дублирования кода важна и может значительно улучшить качество кода.Отлично!

Это может быть шаг в правильном направлении:

public class WebService<T1, T2, T3> {
    private T1 _client;
    private T3 _user;

    //No T2

    public WebService(T1 wsClient, T3 wsUser) {
        _client = wsClient;
        _user = wsUser;
        //No interface
    }

    public void CallWebService(string url, string userName, string password) {
        (...)
        var channelFactory = new ChannelFactory<T2>(binding, endpoint);   <---- use the T2 type
        (...)
    }
}

, а затем

var someServiceA = new WebService<WebServiceWRGClient, WebServiceWRG, Whatever_GRACE_GRACES_User()_returns_here>(new WebServiceWRGClient(), new GRACE_GRACES.User());

(обратите внимание напотому что тип не WebService, а WebService<X,Y,Z>)


Следующий шаг

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

public class WebService<T> {
    private Baseclassofallclients _client;
    private UserTypeHere _user;


    public WebService( Baseclassofallclients wsClient, UserTypeHere  wsUser) {
        _client = wsClient;
        _user = wsUser;
        //No interface
    }

    public void CallWebService(string url, string userName, string password) {
        (...)
        var channelFactory = new ChannelFactory<T>(binding, endpoint);   <---- use the T type here
        (...)
    }

и затем

var someServiceA = new WebService<WebServiceWRG>(new WebServiceWRGClient(), new GRACE_GRACES.User());
var someServiceB = new WebService<WebServiceAWI>(new WebServiceAWIClient(), new ARM_ARMS.User());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...