Podział aplikacji na warstwy

0

Piszę serwis windowsowy i projekt podzieliłem na 4 warstwy:

  • Core ( Model, interfejsy )
  • Infrastructure ( implementacje interfejsów, db, Dapper )
  • ApplicationWindowsService ( Główny Start tutaj )
  • Services ( serwisy, logika biznesowa używająca Core, Infrastructure )

jednym z zadań jest wysyłka smsa.
Chce skorzystać z jakiejś bramki, która ma API. Można nawet wysłać POSTem lub GETem jakiś sparametryzowany URL.
Pytanie_1 brzmi gdzie z powyższych to umieścić?
Tzn. czy stworzyć serwis, który wywoła HttpWebRequest i tyle. Wtedy leci to do Services.

Pytanie_2
leniwie - mam już cały url, który mógłbym wywołać ( z 5 parametrów w query stringu )
mniej leniwie - musiałbym go złożyć ( część paramsów jest stała i dwa z bazy )
Jak wywołać leniwe rozwiązanie?

1

Pytanie 1- ja bym stworzyl oddzielny interfejs, np. ISmsSender i ukryl za nim implementacje wysylania SMSow. Sama implementacje umiescilbym albo w projekcie Infrastruktura, albo w nowym projekcie odpowiedajacym za integracje z zewnetrznymi serwisami. Ewentualnie, jesli przewidujesz mozliwosc zmiany (szczegolnie dynamicznego podmieniania) operatora SMSow to stworzyl bym nowy projekt odpowiadajacy tylko za SMSy.

Pytanie 2- nie rozumiem pytania

0

ad 2)
inaczej, jak wysłać POSTem dane? Poniższy kod podczas debugowania po prostu wychodzi z debugera w 1szej linijce metody Send()

public class SerwerSMSService : ISerwerSMSService
    {
        public static readonly string API_URL = "https://api1.serwertestowysmspl/";
        private static readonly HttpClient httpClient = new HttpClient();

        public FormUrlEncodedContent content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("login", "login"),
            new KeyValuePair<string, string>("haslo", "secretPass"),
            new KeyValuePair<string, string>("akcja", "action"),
            new KeyValuePair<string, string>("nadawca", "Roznosiciel"),
            new KeyValuePair<string, string>("numer", "555666555"),
            new KeyValuePair<string, string>("wiadomosc", "pozdrawiam z mojego SMSa")
        });
        
        public async Task Send(Message message)
        {
            HttpResponseMessage SerwerSMSResponse = await httpClient.PostAsync(API_URL, content);

            HttpContent SerwerSMSResponseContent = SerwerSMSResponse.Content;
        }
    }
0

zastanawiam się czy w ten sposób używając Task, async, await .... czy mogę tak w aplikacji działającej jako serwis...

0

Domyslam sie ze debugger Ci "wychodzi" bo jest to wywolanie asynchroniczne. Co jesli w metodzie Send() postawisz breakpoint na drugiej linii kodu?

zastanawiam się czy w ten sposób używając Task, async, await .... czy mogę tak w aplikacji działającej jako serwis...

Nie do konca rozumiem w czym jest problem. Bez urazy ale musisz sie nauczyc formulowac poprawnie pytania.

0

Przepraszam fakt.
Jeśli postawię pułapkę w linii 2 dokładnie to samo - aplikacja kończy działanie.

Jeśli zmienię metodę Send() tak to ładnie działa. .Result() sprawia, że działa synchronicznie.

public class SerwerSMSService : ISerwerSMSService
    {
        public static readonly string API_URL = "https://api1.serwersms.pl/zdalnie/";

        public FormUrlEncodedContent content = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("login", "login"),
            new KeyValuePair<string, string>("haslo", "secretPass"),
            new KeyValuePair<string, string>("akcja", "action"),
            new KeyValuePair<string, string>("nadawca", "Roznosiciel"),
            new KeyValuePair<string, string>("numer", "555666555"),
            new KeyValuePair<string, string>("wiadomosc", "pozdrawiam z mojego SMSa")
        });
        
        public async Task Send(Message message)
        {
            using (var client = new HttpClient())
            {
                var response = client.PostAsync(API_URL, content).Result;

                if (response.IsSuccessStatusCode)
                {
                    var responseContent = response.Content;

                    string responseString = responseContent.ReadAsStringAsync().Result;
                }
            }
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1