ASP.NET Core 7 Mart da Visual Studio 2017 nin sunumu ile birlikte yeni SDK ve Runtime sürümleri ile geliştiricilere duyuruldu. .NET Core u ilk versiyonundan bu yana takip edenler bazı kütüphanelerin henüz uyarlanmadığını ve bu kütüphanelerin .NET Standard ile hedeflenen versiyon sürümlerinde destekleneceğini gözlemlemektedir.

.NET Standard 1.6 için henüz uyarlanmamış farklı tipteki kütüphaneler için ki burada örneğimiz SMTP olacak; dinamik veriler ile ilgili mail şablonunun oluşturulup gönderimini sağlanmak üzerinden kullanımını örneklendireceğim.

Bu kapsamda .NET Core proje şablonu üzerinden .NET Full Framework destekli bir proje oluşturabiliriz. Böylelikle ilgili paket desteği uyarlandığında veya bağımlı bulunduğumuz kütüphanelere CoreFx tarafından uyarlama gerçekleştiğinde projemizi Cross-Platform bir yapıya kolaylıkla taşıyabiliriz.

3 proje oluştururak başlıyorum:

Modellerimizi .NET Standard 1.6 ve NET46 destekli ortak bir kütüphanede tutabiliriz (NetCore.Contracts). Böylelikle diğer projeler; ister .NET Core 1.1 ister .NET46 Full Framework olsun, bu ortak kütüphane ile tip - model veya arayüzler üzerinde çalışabilecek ve bu projeyi referans alabileceklerdir.

RegistrationViewModel bir kullanıcı kaydı tipini bize modelliyor olsun. Bu tip aracılığıyla arayüzden aldığımız bilgileri entegrasyon amaçlı kullandığımız NET46 destekli NetCore.Integrations isimli proje üzerinde belirlediğimiz HTTP (localhost:port/api/mail/sendasync) adresine POST edeceğiz.

Razor Templating

Razor View Engine ile tipi belirttiğimiz;

@model RegistrationViewModel

.cshtml uzantılı dosyaları çalışma zamanında ilgili modeli parametre geçerek dinamik html çıktılar üretebiliriz. .NET Core MVC nin tamamen arayüzlere dayalı uyarlamaları bizlere büyük kolaylık sağlamaktadır.

Öncelikle .cshtml uzantılı sabit bir şablonu nereden elde edeceğimize karar verelim. Ben burada EmbededResource yani bir kütüphane içerisinde derlenmiş bir kaynak olarak elde edeceğimizi varsayıyorum.

Proje yapısı aşağıdaki şekilde olacaktır:

ayrıca csproj dosyamızda

  <ItemGroup>
<EmbeddedResource Include="templates\**\*.cshtml" Exclude="bin\**;obj\**;packages\**;@(EmbeddedResource)" />
</ItemGroup>

bölümünün eklenmiş olması gerekmektedir. Böylelikle projeyi derlediğimizde template dosyalarının assembly ile birlikte dağıtımını sağlamış olacağız.

Mail ayarları için appsettings.json dosyasını aşağıdaki şekilde güncelleyip MailSettings tipinin gerekli ayarları çalışma zamanında EnvironmentName e göre kazanmasını sağlayabiliriz. MailTemplateFileProvider' ın uygulamamız ile olan bağlantısını Startup.cs dosyasında şu şekilde yapmamız gerekmektedir.

Böylelikle ASP.NET Core ile varsayılan olarak kullandığımız bağımlılık yönetimi Dependency Injection kurgusunu tamamlamış oluruz. (Strongly Typed Configuration)

Ayarları doğru olarak tamamladığımızda NetCore.Integrations projesinde kullanacağımız Controller için constructor yapısı aşağıdaki şekilde çalışacaktır.

private readonly MailProvider _mailProvider;

public MailController(MailProvider mailProvider)
{
    _mailProvider = mailProvider;
}

İstemci tarafından çağrılacak ve mail gönderme görevini yerine getirecek fonksiyon ise;

[HttpPost(nameof(SendAsync))]
public async Task SendAsync([FromBody]RegistrationEmailViewModel message)
{
    var messageBody = await _mailProvider.RenderMailViewAsync(ControllerContext, MailTemplate.RegistrationComplete, message);
    await _mailProvider.SendAsync(message.To, message.Subject, messageBody);
}

formunda olacaktır. Böylelikle istediğimiz model ve şablonlar ile ilişkileri kurarak farklı içeriklerde e-postalar oluşturup gönderebiliriz.

Proje kaynak kodlarına Github üzerinden erişebilirsiniz. Ayrıca .NET Core için geliştirilmiş Proxy ve WebSockets uyarlamalarını NetCoreStack - Github adresinden inceleyebilir, proxy ile şablon maillerin yönetimini deneyebilirsiniz.