c# Jak pobrać ścieżkę do pliku, który znajduje się w oddzielnej bibliotece klas?

0

Mam sobie klasę, która jest w bibliotece klas o nazwie A.
W klasie z biblioteki muszę umieścić kod, który mi podbierze ścieżkę do pliku, który znajduje się w bibliotece klas o nazwie B.
Następnie muszę tą ścieżkę przekazać do serwisu, który znajduje się w bibliotece klas C.

Pewnie trywialna sprawa, ale siedzę i przeglądam googla i nic nie mogę z tych informacji urodzić.

0

Możesz wkleić kod jako przykład?

0
fasadin napisał(a):

Możesz wkleić kod jako przykład?

Nie bardzo wiem co tu wklejać. Po prostu chcę odczytać ścieżkę do pliku, który znajduje się w innej bibliotece/projekcie niż ta w której jest wykonywany kod. Framework to .Net Core 5

1

Tak, to trywialna sprawa, wyjaśnienie jest tutaj: https://en.wikipedia.org/wiki/XY_problem

Co właściwie chcesz taką kombinacją osiągnąć?

0

@altek: Po prostu chcę odczytać ścieżkę do pliku, który znajduje się w innej bibliotece/projekcie niż ta w której jest wykonywany kod.

odczytać z czego? z klasy? z pliku konfiguracyjnego? Czemu tej informacji nie zawrzesz w projekcie tam gdzie to potrzebujesz? Jezeli nie chcesz dzielic kodu miedzy dwoma wedlug zasady DRY to stworz projekt D ktory bedzie takie informacje zawieral (chociaz to ostatnie bardzo zalezy od sytuacji, a nie wiem co chcesz osiagnac)

0

@somekind: @fasadin:
Stworzyłem projekt na przykładnie tego rozwiązania https://github.com/jasontaylordev/CleanArchitecture.
Teraz mam takie zagadnienie:
W warstwie infrastruktury umieściłem serwis do wysyłania maili.
Serwis ten posiada ten dwie metody:
"SendEmail" - przyjmuje parametr "string htmlContent" i wysyła maila.
"ReadHtmlTemplate" - przyjmuje parametr "htmlPath" i zaczytuje zawartość pliku html do stringa oraz go zwraca.

Szablony html, których używam w mailach umieściłem w warstwie domeny (nie jestem pewien czy tam powinny być?).
W warstwie aplikacji mam "command handler" do którego wstrzykuję serwis do wysyłki maili. W handlerze (warstwa aplikacji) najpierw za pomocą metody "ReadHtmlTemplate" zaczytuję zawartość szablonu html do zmiennej typu string. Do tego jest mi potrzebna ścieżka szablonu html, który jest w warstwie domeny (w zasadzie nie ważne gdzie on by był to i tak muszę tą ścieżkę pobrać).

Ścieżki nie mogę zaszyć na sztywno bo w zależności do jakiego katalogu ktoś sobie sklonuje repozytorium gita to taka będzie ściezka.
Na środowiskach testowych czy produkcyjnych też może być inna więc musi być pobierana w locie.

Wszelkie uwagi (nawet krytyczne) i propozycje rozwiązania tego problemu mile widziane.

0

Ja takie rzeczy trzymam w bazie danych:

public class EmailTemplate
    {
        [Key]
        public Guid Id { get; set; }
        public string Description { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }
//wyciąłem EmailTemplate.eEmailTemplateType aby nie robić zamieszania
public interface IGeneralEmailSender : IEmailSender
    {
        List<EmailTemplate> Emailtemplates { get; }
        void AddTemplate(string Description, string Title, string Body, EmailTemplate.eEmailTemplateType TemplateType);
        Task AddTemplateAsync(string Description, string Title, string Body, EmailTemplate.eEmailTemplateType TemplateType);
        void EditTemplate(EmailTemplate emailTemplate);
        Task EditTemplateAsync(EmailTemplate emailTemplate);
        void RemoveTemplate(Guid Id);
        Task RemoveTemplateAsync(Guid Id);
        EmailTemplate FindById(Guid Id);
        Task<EmailTemplate> FindByIdAsync(Guid Id);
        EmailTemplate FindByName(string Name);
        Task<EmailTemplate> FindByNameAsync(string Name);
        bool CanDeleteTemplate(Guid Id);
        List<EmailTemplate> GetTemplatesForType(EmailTemplate.eEmailTemplateType templateType);
        Dictionary<string, string> GetTagsByEmailType(EmailTemplate.eEmailTemplateType templateType);
    }

I teraz przykład użycia:

public class NotificationService : INotificationService
{
      //...
     private readonly IGeneralEmailSender _emailSender;
     //...
     public async Task CancelVoucher(Voucher voucher)
        {
            GeneralSetting settings = _generalSettings.GeneralSettings;
            if (!settings.EmailTemplate_CancelVoucher.HasValue)
                return;
            EmailTemplate emailTemplate = _emailSender.FindById(settings.EmailTemplate_CancelVoucher.Value);
            if (emailTemplate == null || string.IsNullOrEmpty(emailTemplate.Body) || voucher.ApplicationUser == null)
                return;

            string Body = EmailBegin() + emailTemplate.Body
                .Replace("^UserFirstName", voucher.ApplicationUser.FirstName)
                .Replace("^UserLastName", voucher.ApplicationUser.LastName)
                .Replace("^TotalCost", voucher.TotalCost.ToString())
                .Replace("^VoucherNumber", voucher.ID.ToString())
                .Replace("^VoucherAvailableCoins", voucher.AvailableCoins.ToString())
                .Replace("^VoucherExpiryTime", voucher.ExpiryTime.ToString(@"dd.MM.yyyy HH:mm"))
                + EmailEnd();
                
            await _emailSender.SendEmailAsync(voucher.ApplicationUser.Email, emailTemplate.Title, Body);
        }
}
2
altek napisał(a):

Szablony html, których używam w mailach umieściłem w warstwie domeny (nie jestem pewien czy tam powinny być?).

Nie powinny być w żadnej, bo to przecież jakaś konfiguracja. Konfiguracja to część uruchomionej aplikacji, a nie kodu jakiejś warstwy.
Widzę takie możliwości:

  1. Wrzuć te szablony do jakiegoś katalogu, skonfiguruj aplikację tak, aby działała z tym katalogiem.
  2. Umieść te szablony w katalogu aplikacji, ustaw im build option na "copy to output directory", a potem w aplikacji pobierz ścieżkę uruchomionej aplikacji, a następnie doklej sobie do niej relatywną ścieżkę do katalogu z szablonami.

Ścieżki nie mogę zaszyć na sztywno bo w zależności do jakiego katalogu ktoś sobie sklonuje repozytorium gita to taka będzie ściezka.

Widziałeś kiedyś aplikację, która wymaga połączenia z gitem do zadziałania?

0

Podzielam zdanie @somekind. Nie jestem zwolennikiem trzymania konfiguracji w bazie danych. Wtedy aplikacja jest zależna od tego co jest w bazie a nie od kodu aplikacji

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