Aracılığıyla paylaş


Aracılı hizmet temelleri

Aracılı hizmet, aracılığıyla IServiceBrokeralınan bir hizmettir ve hizmetin ve istemcisinin farklı AppDomain'lerde, işlemlerde ve hatta makineler arasında (Canlı Paylaşım söz konusu olduğunda) var olmasını sağlamak için RPC uyumlu bir arabirim olarak kullanıma sunulur. Aracılı hizmet, ana Visual Studio işleminden veya yardımcı işlemlerinden bazılarından alınabilir ve bu işlemlerden herhangi biri tarafından bir Visual Studio uzantısı tarafından kullanılabilir.

Daha fazla (aracısız) Visual Studio hizmeti, Hizmetleri Kullanma ve Sağlama bölümünde açıklandığı gibi arabirim aracılığıyla IServiceProvider kullanılabilir. Bu tür hizmetler genellikle yalnızca ana Visual Studio işleminde kullanılabilir ancak aracılı hizmetlerden daha büyük bir işlev kümesi sunar.

Canlı Paylaşım konuğunda çalışan bir Visual Studio uzantısı, Canlı Paylaşım konağı tarafından sunulan bu hizmetlerin bir alt kümesine erişerek ek işlevler sağlayabilir. Yetkilendirme denetimleri, hatalı davranan bir Live Share konuğunun Canlı Paylaşım konağı güvenliğini tehlikeye atma riskini azaltmak için Canlı Paylaşım bağlantıları üzerinden geçerlidir. Hizmetlerini Live Share üzerinden kullanıma sunmayı seçen aracılı hizmetlerin yazarları, Aracılı hizmet sağlama bölümünde açıklandığı gibi yetkilendirme denetimleri uygulamaya özen göstermelidir.

Hizmet aracısı

Visual Studio'da, diğer hizmeti kullanıma sunan ile benzer (ve bu hizmetten alınabilir) GlobalProvider bir genel IServiceBrokerbulunur. Ayrıca MEF aracılığıyla da alınabilir.

Genel olanı kendilerinden biriyle toplamak isteyen ve ek hizmetler sunan (veya belki bazılarını bastıran) belirli Visual Studio özellikleri tarafından sunulan başka bağlama özgü hizmet aracıları da olabilir.

, IServiceBroker (kasıtlı olarak) istemcinin yerel, başka bir işlemde veya başka bir makinede olabilecek hizmetleri almasına olanak tanıyan bir kara kutudur. Hizmet aracıları, ilkeler uygulanmış bir veya daha fazla kişinin toplamları olabilir.

Visual Studio işleminin içinde olduğu bağlama bağlı olarak, bu genel hizmet aracısı değişen diğer hizmet aracıları kümesinin bir toplamıdır. İşlem içindeki bağlam değişiklikleri, etkinleştirilebilen aracılı hizmetler kümesini değiştirebilir. Örneğin, bir çözüm yüklendiğinde özellikle etkin çözümle ilgili bir hizmet kullanılabilir hale gelebilir. Aynı hizmet, farklı bir yedekleme uygulamasıyla da olsa Klasör Aç görünümünde de kullanılabilir. Her iki uygulamanın da aynı sözleşmeyi yerine getirmesi gerektiğinden, hizmet uygulamasındaki değişiklik bu hizmetin istemcisi için saydam olur, ancak istemcinin yeni örneği almak için bu bağlam değişikliğinde hizmeti yeniden sorgulaması gerekir (bu değişiklik üzerinden AvailabilityChangedbildirilir).

Hizmet aracısı genellikle hizmete bir ara sunucu almak için kullanılır. Başka bir ifadeyle, doğrudan hizmet nesnesine başvuru almak yerine istemci, tüm yöntem çağrılarını hizmete ve sonuçları veya özel durumları istemciye geri iletan bir saplama alır. Ayrıca hizmet tarafından tetiklenen olayları istemciye iletebilir. Bazı durumlarda bir hizmet, istemcinin istemciye geri çağrı yapmak için yöntemleri çağırabileceği bir "hedef nesne" sunduğunu destekleyebilir veya gerektirebilir.

Aracılı hizmet kapsayıcısı

Genel 'den IServiceBrokersağlanabilmesi IBrokeredServiceContainer için hizmetlerin içine alınması gerekir. Bu hizmet kapsayıcısı yalnızca hizmet fabrikasını hizmet aracısına ifşa etmekle kalmaz, aynı zamanda hizmete erişimi olan istemcileri denetlemek ve bu hizmete erişim değiştiğinde bu istemcileri bilgilendirmek için de sorumludur.

Aracılı bir hizmetin bileşimi

Aracılı hizmet aşağıdaki öğelerden oluşur:

  • Hizmetin işlevselliğini bildiren ve hizmetle istemcileri arasında sözleşme görevi üstleyen bir arabirim.
  • Bu arabirimin bir uygulaması.
  • Hizmete ServiceMoniker bir ad ve sürüm atamak için A.
  • ServiceRpcDescriptor gerektiğinde RPC'yi ServiceMoniker işleme davranışıyla birleştiren bir.
  • Servis fabrikasını açmak için kod
  • Hizmet kaydı

Hizmet arabirimi

Bu standart bir .NET arabirimi olabilir (genellikle C# dilinde yazılır). Aracılı hizmet istemcilerinin ve hizmetlerinin farklı işlemlerde bulunmasına ve RPC üzerinden iletişim kurmasına izin vermek için, bu arabirim hizmetinizin kullanacağı kısıtlamalara ServiceRpcDescriptor uymalıdır. Bu kısıtlamalar genellikle özelliklere ve dizin oluşturuculara izin verilmemesi ve çoğu veya tüm yöntemlerin döndürülmesi Task veya zaman uyumsuz başka bir dönüş türü içerir.

Aracılı hizmet ad ve tanımlayıcıları

Bir hizmetin etkinleştirilmesi için bilinen adın bilinmesi gerekir. Ad, hizmetin tanımlayıcısında yer aldığı için, bir istemci genellikle yalnızca ile ServiceRpcDescriptorilgilenebilir. Tanımlayıcı, aracılı hizmet ile istemcisi arasında rpc bağlantısı kurmak için veya bir öğesine/üzerinden Streamrpc çağrılarını seri hale getirmek için gerektiğinde gerekli davranışı ekler.

Visual Studio, istemci ve hizmet rpc'nin iletişim kurmasını ServiceJsonRpcDescriptor gerektirdiğinde StreamJsonRpc kitaplığını kullanan aracılı hizmetler için türetilmiş türün kullanılmasını önerir. StreamJsonRpc, burada açıklandığı gibi hizmet arabiriminde belirli kısıtlamalar uygular.

Tanımlayıcının nadiren doğrudan kullanılması gerekir. Bunun yerine genellikle hizmetinden veya kitaplığından VisualStudioServices alınır, ardından bağımsız GetProxyAsyncdeğişken olarak kullanılır.

ServiceMoniker Hem hem de ServiceJsonRpcDescriptor sınıfları sabittir ve bu nedenle alan veya özellik olarak static readonly paylaşılabilir. Diğer ServiceRpcDescriptortüretilmiş türler sabit olmalıdır.

A ServiceMoniker serileştirilebilir. A ServiceJsonRpcDescriptor serileştirilebilir değildir.

Hizmet hedef kitlesi

Aracılı her hizmet, 'den ServiceAudiencebir bayrak seçimiyle kaydedilir. Bu bayraklar aracılı hizmetin hangi istemcilere ve hangi bağlantılara açık olacağını denetler.

Tipik bir seçim, hizmeti Visual Studio oturumundaki herhangi bir yerel işlemde kullanıma sunan seçeneğidir ServiceAudience.Local. Bu ayarda, Canlı Paylaşılan oturum etkin olsa bile hizmet her zaman yerel olarak etkinleştirilir.

ServiceAudience.LiveShareGuest Bayrak eklendiğinde, aracılı hizmete istekte bulunan bir Live Share konuğu, Live Share konağıyla uzak bağlantı üzerinden aracılı hizmete bir proxy alır.

üzerinde ServiceAudience tanımlanan tüm bayrak bileşimleri yasaldır. BayrakLiveShareGuest, bayrağı ayarlanmadanLocal da ayarlanabilir. Örneğin, aracılı bir hizmeti yalnızca Live Share konuklarına (Live Share konağından) kullanıma sunma ve yerel olarak (istemci ve hizmetin aynı işlemde olduğu durumlarda) hiçbir zaman kullanılamayabilir.

RemoteExclusiveClient ve RemoteExclusiveServer bayrakları kullanım dışıdır.

İstemci aracılı bir hizmet istediğinde, hizmetin ne ServiceAudience olduğunu veya hizmetin nerede etkinleştirileceğini bilmesi gerekmez. Ancak, bir hizmetin bu değeri belgelemesi ve hizmeti kullanan bir geliştiricinin hizmetin nerede etkinleştirilebileceğini bilmesi ve bu hizmetin çeşitli bağlamlarda ne tür veriler geldiğini ve hizmetin ne zaman kullanılabilir olabileceğini tahmin edebilmesi yararlı olabilir.

Aracılı istemcinin bileşimi

İstemci aracılı bir hizmet istediğinde, hizmet kullanılamadığında geri döner null , hizmet etkinleştirmede başarısız olursa bir ServiceActivationFailedException oluşturulur veya hizmete bir ara sunucu alır. Aracılı hizmetin istemciyle aynı işlemde veya farklı bir işlemde etkinleştirilmesi fark etmeksizin bir ara sunucu kullanılır. Bu ara sunucu, istemcinin hizmetin nerede bulunduğunu bilmesi gerekmemesi için yerel ve uzak hizmet olaylarının kullanım düzenlerini uyumlu hale getirmek için yardımcı olur.