Aracılığıyla paylaş


Orleans kod oluşturma

7.0'den önce Orleans , kaynak oluşturma çok daha el ile ve gerekli açık geliştirici müdahalesiydi. 7.0'dan Orleans itibaren kod oluşturma otomatiktir ve geliştirici müdahalesi gerektirmez. Ancak, geliştiricilerin otomatik olarak oluşturulmayan türler için kod oluşturmak veya başka bir derlemedeki türler için kod oluşturmak gibi kod oluşturmayı etkilemek isteyebileceği durumlar da vardır.

Kod oluşturmayı etkinleştirme

Orleans derleme zamanında uygulamanız için C# kaynak kodu oluşturur. Kod oluşturmayı etkinleştirmek için konağınız da dahil olmak üzere tüm projelerin uygun NuGet paketlerinin yüklü olması gerekir. Aşağıdaki paketler kullanılabilir:

GenerateSerializerAttribute türün seri hale getirilmesinin amaçlandığını ve tür için serileştirme kodunun oluşturulması gerektiğini belirtmek için öğesini kullanın. Daha fazla bilgi için bkz. Serileştirmeyi kullanmaOrleans.

Çalışma Orleans zamanı, hem küme genelinde kullanılan türlerin düzgün seri hale getirilmesini sağlamak hem de yöntem gönderimi, özel durum yayma ve diğer iç çalışma zamanı kavramlarının uygulama ayrıntılarını soyutlayan ortak oluşturma için oluşturulan kodu kullanır. Kod oluşturma, projeleriniz oluşturulurken veya uygulamanız başlatıldığında gerçekleştirilebilir.

Derleme sırasında ne olur?

Derleme zamanında, Orleans ile GenerateSerializerAttributeişaretlenmiş tüm türler için kod oluşturur. Bir tür ile GenerateSerializerişaretlenmemişse, tarafından Orleansseri hale getirilmeyecektir.

F# veya Visual Basic ile geliştiriyorsanız kod oluşturmayı da kullanabilirsiniz. Daha fazla bilgi için aşağıdaki örneklere bakın:

Bu örnekler, kaynak oluşturucunun Orleans.GenerateCodeForDeclaringAssemblyAttributeinceleyip kaynağı oluşturması gereken derlemedeki türleri belirterek öğesinin nasıl tüketileceğini gösterir.

Kod oluşturma işlemini gerçekleştirmek için tercih edilen yöntem derleme zamanındadır. Derleme zaman kodu oluşturma, aşağıdaki paketlerden biri kullanılarak etkinleştirilebilir:

  • Microsoft..Orleans. OrleansCodeGenerator.Build. Kod oluşturma için Roslyn kullanan ve analiz için .NET Yansımasını kullanan bir paket.
  • Microsoft..Orleans. CodeGenerator.MSBuild. Hem kod oluşturma hem de kod analizi için Roslyn'i kullanan yeni bir kod oluşturma paketi. Uygulama ikili dosyalarını yüklemez ve sonuç olarak, bağımlılık sürümleriyle farklı hedef çerçevelerin çakışmasından kaynaklanan sorunları önler. Yeni kod oluşturucu artımlı derlemelere yönelik desteği de geliştirir ve bu da daha kısa derleme süreleriyle sonuçlanır.

Bu paketlerden biri tanecikler, tane arabirimleri, özel serileştiriciler veya taneler arasında gönderilen türler içeren tüm projelere yüklenmelidir. Paketin yüklenmesi, projeye derleme zamanında kod oluşturacak bir hedef ekler.

Her iki paket de (Microsoft.Orleans.CodeGenerator.MSBuild ve Microsoft.Orleans.OrleansCodeGenerator.Build) yalnızca C# projelerini destekler. Diğer diller, aşağıda açıklanan paket kullanılarak Microsoft.Orleans.OrleansCodeGenerator veya diğer dillerde yazılmış derlemelerden oluşturulan kod için hedef olarak davranabilen bir C# projesi oluşturularak desteklenir.

Hedef projenin .csproj dosyasında için OrleansCodeGenLogLevel bir değer belirterek derleme zamanında ek tanılamalar yayılabilir. Örneğin, <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.

Başlatma sırasında ne olur?

7+'da Orleans başlatma sırasında hiçbir şey olmaz. Kod oluşturma işlemi derleme zamanında gerçekleştirilir.

Paket yüklenip Microsoft.Orleans.OrleansCodeGenerator uzantı yöntemi kullanılarak ApplicationPartManagerCodeGenExtensions.WithCodeGeneration istemcide ve siloda başlatma sırasında kod oluşturma gerçekleştirilebilir:

builder.ConfigureApplicationParts(
    parts => parts
        .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
        .WithCodeGeneration());

Aşağıdaki örnekte, builder veya IClientBuilderörneği ISiloHostBuilder olabilir. kod oluşturma sırasında günlüğe WithCodeGeneration kaydetmeyi etkinleştirmek için isteğe bağlı ILoggerFactory bir örnek geçirilebilir, örneğin:

ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
    builder.ConfigureApplicationParts(
        parts => parts
            .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
            .WithCodeGeneration(codeGenLoggerFactory));

Etki kodu oluşturma

Bir türe uygularken GenerateSerializerAttribute , üyeyi IdAttribute benzersiz olarak tanımlamak için de uygulamasını uygulayabilirsiniz. Benzer şekilde, ile AliasAttributebir diğer ad da uygulayabilirsiniz. Kod oluşturmayı etkileme hakkında daha fazla bilgi için bkz. Serileştirmeyi kullanmaOrleans.

Kod oluşturma sırasında, belirli bir tür için kod oluşturmayı etkileyebilirsiniz. Kod, tahıl yöntemlerinde bağımsız değişken olarak geçirilen tanecik arabirimleri, tanecik sınıfları, tanecik durumu ve türleri için otomatik olarak oluşturulur. Bir tür bu ölçütlere uymuyorsa, kod oluşturma işleminde daha fazla yol göstermek için aşağıdaki yöntemler kullanılabilir.

Bir türe eklemek SerializableAttribute , kod oluşturucusunun bu tür için bir seri hale getirici oluşturmasını sağlar.

Projeye eklemek [assembly: GenerateSerializer(Type)] , kod oluşturucuya bu türü serileştirilebilir olarak ele alma talimatını alır ve bu tür için bir seri hale getirici oluşturulamazsa (örneğin, tür erişilebilir olmadığından) bir hataya neden olur. Kod oluşturma etkinse bu hata derlemeyi durdurur. Bu öznitelik, başka bir derlemeden belirli türler için kod oluşturulmasına da olanak tanır.

[assembly: KnownType(Type)] ayrıca kod oluşturucusunun belirli bir tür (başvurulan derlemeden olabilir) içermesini ister, ancak türe erişilemezse özel duruma neden olmaz.

Tüm alt türlerde seri hale getiriciler oluşturma

Bir arabirime veya sınıfa eklemek KnownBaseTypeAttribute , kod oluşturucuya bu türü devralan/uygulayan tüm türler için serileştirme kodu oluşturmasını bildirir.

Başka bir derlemedeki tüm türler için kod oluşturma

Oluşturulan kodun derleme zamanında belirli bir derlemeye eklenemediği durumlar vardır. Örneğin, buna başvurmayan Orleanspaylaşılan kitaplıklar, C# dışındaki dillerde yazılmış derlemeler ve geliştiricinin kaynak kodu olmayan derlemeler dahil edilebilir. Böyle durumlarda, bu derlemeler için oluşturulan kod, başlatma sırasında başvurulan ayrı bir derlemeye yerleştirilebilir.

Bunu bir derleme için etkinleştirmek için:

  1. C# projesi oluşturun.
  2. Microsoft.Orleans.CodeGenerator.MSBuild veya Microsoft.Orleans.OrleansCodeGenerator.Build paketini yükleyin.
  3. Hedef derlemeye bir başvuru ekleyin.
  4. C# dosyasının en üst düzeyinde ekleyin [assembly: KnownAssembly("OtherAssembly")] .

, KnownAssemblyAttribute kod oluşturucuya belirtilen derlemeyi incelemesini ve içindeki türler için kod oluşturmasını belirtir. Özniteliği bir proje içinde birden çok kez kullanılabilir.

Oluşturulan derlemenin başlatma sırasında istemciye/siloya eklenmesi gerekir:

builder.ConfigureApplicationParts(
    parts => parts.AddApplicationPart("CodeGenAssembly"));

Aşağıdaki örnekte, builder veya IClientBuilderörneği ISiloHostBuilder olabilir.

KnownAssemblyAttribute, kod oluşturucusunun true bu TreatTypesAsSerializablederlemedeki tüm türler serileştirilebilir olarak işaretlenmiş gibi davranmasını bildirmek üzere ayarlanabilir isteğe bağlı bir özelliğine sahiptir.