Yönetilen Genişletilebilirlik Çerçevesi
Bu bölümde, Yönetilen Genişletilebilirlik Çerçevesini (MEF) tartışacağız. MEF, üçüncü taraf eklenti genişletilebilirliği için kullanılabilir veya gevşek bağlı eklenti benzeri bir mimarinin faydalarını normal uygulamalara getirebilir.
MEF, hafif, genişletilebilir uygulamalar oluşturmak için bir kitaplıktır.
Uygulama geliştiricilerin, yapılandırma gerektirmeden uzantıları keşfetmelerine ve kullanmalarına olanak tanır.
MEF, .NET Framework 4'ün ayrılmaz bir parçasıdır ve büyük uygulamaların esnekliğini, sürdürülebilirliğini ve test edilebilirliğini artıran .NET Framework'ün kullanıldığı her yerde mevcuttur.
MEF'i, ister Windows Forms, WPF veya başka bir teknoloji kullanıyor olsun, istemci uygulamalarınızda veya ASP.NET kullanan sunucu uygulamalarında kullanabilirsiniz.
MEF şu şekilde taşınmıştır: Microsoft.Composition .NET Core için de ama kısmen.
Bir tek System.Composition taşınır ve System.ComponentModel.Compositionhenüz mevcut değil. Bu, bir dizindeki derlemelerden türleri yükleyebilen kataloglara sahip olmadığımız anlamına gelir.
Bu bölümde, sadece MEF'i .NET Core uygulamasında nasıl kullanabileceğimizi öğreneceğiz.
NET Core konsol uygulamasında MEF'i kullanacağımız basit bir örneği anlayalım. Şimdi yeni bir .NET Core konsol projesi oluşturalım.
Sol bölmede seçin Templates → Visual C# → .NET Çekirdek ve ardından orta bölmede Konsol Uygulaması (.NET Core) öğesini seçin.
Ad alanına projenin adını girin ve Tamam'a tıklayın.
Proje oluşturulduktan sonra, MEF'i kullanabilmemiz için Microsoft.Composition referansını eklememiz gerekiyor. Bunu yapmak için, Çözüm Gezgini'nde projeye sağ tıklayalım veManage NuGet Packages…
Aramak Microsoft.Composition ve tıkla Install.
Tıkla OK buton.
Tıkla I Accept buton.
Kurulum tamamlandığında, Referanslar'da bir hata bulacaksınız.
Açalım project.json dosya.
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.Composition": "1.0.30",
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}
Görebilirsiniz Microsoft.Composition bağımlılık eklendi, ancak sorun şu ki bu paket ile uyumlu değil dnxcore50. Bu yüzden ithal etmemiz gerekiyorportablenet45+win8+wp8+wpa81. Şimdi değiştirelimproject.json aşağıdaki kod ile dosya.
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.Composition": "1.0.30",
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "portable-net45+win8+wp8+wpa81"
}
}
}
Bu dosyayı kaydedin ve hatanın düzeltildiğini göreceksiniz.
Referansları genişletirseniz, bir referans göreceksiniz. Microsoft.Composition.
Öncelikle, dışa aktarılacak bir arayüz oluşturmalı ve arayüzü uygulamalı ve sınıfı export niteliği ile dekore etmeliyiz. Şimdi yeni bir sınıf ekleyelim.
Sınıfınızın adını Ad alanına girin ve tıklayın Add.
Aşağıdaki kodu şuraya ekleyelim: PrintData.cs dosya.
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using System.Threading.Tasks;
namespace MEFDemo {
public interface IPrintData {
void Send(string message);
}
[Export(typeof(IPrintData))]
public class PrintData : IPrintData {
public void Send(string message) {
Console.WriteLine(message);
}
}
}
Yukarıda belirtildiği gibi, Kataloglar Microsoft.Composition ad alanında kullanılamaz. Bu nedenle, tüm türleri Assembly'den export özniteliğiyle yükleyecek ve Program.cs dosyasındaki Compose yönteminde gösterildiği gibi import özniteliğine ekleyecektir.
using System;
using System.Collections.Generic;
using System.Composition;
using System.Composition.Hosting;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace MEFDemo {
public class Program {
public static void Main(string[] args) {
Program p = new Program();
p.Run();
}
public void Run() {
Compose();
PrintData.Send("Hello,this is MEF demo");
}
[Import]
public IPrintData PrintData { get; set; }
private void Compose() {
var assemblies = new[] { typeof(Program).GetTypeInfo().Assembly };
var configuration = new ContainerConfiguration()
.WithAssembly(typeof(Program).GetTypeInfo().Assembly);
using (var container = configuration.CreateContainer()) {
PrintData = container.GetExport<IPrintData>();
}
}
}
}
Şimdi uygulamanızı çalıştıralım ve uygulamanızı başlatarak çalıştığını göreceksiniz. PrintData sınıf.
MEF hakkında daha fazla bilgi edinmek için aşağıdaki URL'yi ziyaret edelim https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx daha fazla ayrıntı için.