CodeLens가 활성화되어 있습니까?

Visual Studio용 CodeStream 확장에서 우리는 최근 New Relics 관찰 가능성 플랫폼/에이전트의 정보를 제공하는 자체 CodeLens 공급자( )를 추가했습니다. 방법 수준에서 특정 기간 동안 기록된 평균 기간, 처리량 또는 오류를 볼 수 있다는 아이디어입니다. 다른 시간에 더 자세히 😊!

그러나 이것이 한 일은 Visual Studio에서 CodeLens가 활성화되었는지 여부를 알아낼 수 있는 원인을 제공했습니다(모든 것이 비활성화된 경우 공급자는 그다지 좋은 일을 하지 않습니다).

질문은 다음과 같습니다.
  • CodeLens가 활성화되어 있습니까?
  • 사용자 지정 CodeLens 공급자가 활성화되어 있습니까?

  • 둘 중 하나가 "false"인 경우 확장 프로그램에 기능을 켜는 방법 등을 설명하는 마크업을 제공할 수 있습니다. 활성화로 이동” 등

    자, 문제가 설명되었습니다. 자, 어떻게 해결할까요?

    글쎄요, 약간의 마법이 있다는 것이 밝혀졌지만(물론 Visual Studio 확장성입니다!) 작업을 수행하는 것도 그리 어렵지 않습니다.

    서비스 공급자, MEF 또는 COM에 대해 자세히 설명하지는 않겠지만 어떤 종류의 VS 확장성을 수행하는 경우 이에 대해 어느 정도 익숙할 것입니다.

    먼저 DI/IOC/MEF 등이 있기 때문에 새로운 인터페이스와 서비스를 만들었습니다.

    public interface IVsSettings {
        bool IsCodeLevelMetricsEnabled();
        bool IsCodeLensEnabled();
    }
    
    [Export(typeof(IVsSettings))]
    [PartCreationPolicy(CreationPolicy.Shared)]
    public class VsSettings : IVsSettings {
        private readonly ISettingsManager _roamingSettingsManager;
    
        [ImportingConstructor]
        public VsSettings([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider) {
            _roamingSettingsManager = serviceProvider.GetService(typeof(SVsSettingsPersistenceManager)) as ISettingsManager;
        }
    }
    


    설정 관리자를 확인할 수 있도록 여기에 서비스 공급자를 주입해야 합니다. 유형SVsSettingsPersistenceManager이 자체 "버전"을 선언하지 않고는 액세스할 수 없는 내부 어셈블리에 있는 이유는 다음과 같습니다.

    위의 정의에 추가하면 다음과 같습니다.

    public interface IVsSettings {
        bool IsCodeLevelMetricsEnabled();
        bool IsCodeLensEnabled();
    }
    
    [Export(typeof(IVsSettings))]
    [PartCreationPolicy(CreationPolicy.Shared)]
    public class VsSettings : IVsSettings {
        private readonly ISettingsManager _settingsManager;
    
        // THIS PART HERE
        [Guid("9B164E40-C3A2-4363-9BC5-EB4039DEF653")]
        private class SVsSettingsPersistenceManager { }
    
        [ImportingConstructor]
        public VsSettings([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider) {
            _settingsManager = serviceProvider.GetService(typeof(SVsSettingsPersistenceManager)) as ISettingsManager;
        }
    }
    


    이제는 그것이 어떻게/무엇을/왜 필요한지 또는 그 GUID가 무엇과 일치하는지 솔직히 설명할 수 없습니다. Visual Studio의 모든 설정과 해당 값을 파악하기 위한 FANTASTIC 확장인 reading the source for the Settings Store Explorer 확장을 통해 이 솔루션을 사용하게 되었습니다.

    완료되면 상점에서 설정을 가져오는 (일반) 방법을 추가했습니다.

    public interface IVsSettings {
        bool IsCodeLevelMetricsEnabled();
        bool IsCodeLensEnabled();
    }
    
    [Export(typeof(IVsSettings))]
    [PartCreationPolicy(CreationPolicy.Shared)]
    public class VsSettings : IVsSettings {
        private readonly ISettingsManager _settingsManager;
    
        [Guid("9B164E40-C3A2-4363-9BC5-EB4039DEF653")]
        private class SVsSettingsPersistenceManager { }
    
        [ImportingConstructor]
        public VsSettings([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider) {
            _settingsManager = serviceProvider.GetService(typeof(SVsSettingsPersistenceManager)) as ISettingsManager;
        }
    
        // THIS PART
        public T GetSetting<T>(string settingPath) {
            return _settingsManager.TryGetValue(settingPath, out T value); // could throw an exception
        }
    }
    


    이제 IVsSettings를 다른 클래스/서비스에 주입하고 다음과 같이 활용할 수 있습니다.

    [ImportingConstructor]
    public SomeOtherService(IVsSettings vsSettings){
        var isCodeLensEnabled = vsSettings.GetSetting<bool>("TextEditorGlobalOptions.IsCodeLensEnabled");
        var disabledCodeLensProviders = vsSettings.GetSetting<string[]>("TextEditorGlobalOptions.CodeLensDisabledProviders");
    }  
    



    여기까지 하셨다면 감사합니다! 이 작업을 수행하기 위해 지난 주 동안 겪은 다양한 시련과 고난을 통해 무언가를 즐기거나 배웠기를 바랍니다.

    다음 시간까지 친구들!

    좋은 웹페이지 즐겨찾기