service fabric asp .net core IoC error : cannot be dynamically proxied
service fabric asp .net core IoC error : cannot be dynamically proxied
我正在尝试在我的 api 中添加一些 IoC,但一直出现此错误:
The type Inovatic.SF.Windows.Facade.Facade cannot be dynamically proxied. Service types must not be sealed and need to be visible to the DynamicProxyGenAssembly2 assembly. This can be achieved by making the type public or adding the InternalsVisibleToAttribute to the assembly containing the type. e.g. [assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
program.cs:
//[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
namespace Inovatic.SF.Windows.Facade
{
internal static class Program
{
/// <summary>
/// This is the entry point of the service host process.
/// </summary>
private static void Main()
{
try
{
var builder = new ContainerBuilder();
builder.RegisterModule(new GlobalAutofacModule());
builder.RegisterServiceFabricSupport();
builder.RegisterStatelessService<Facade>("Inovatic.SF.Windows.FacadeType");
using (builder.Build())
{
ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Facade).Name);
Thread.Sleep(Timeout.Infinite);
}
}
catch (Exception e)
{
ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
throw;
}
}
}
public class GlobalAutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ConfigSettings>();
builder.RegisterType<PaymentRepository>().As<IPaymentRepository>();
}
}
}
我试过把它放在那里(但不确定它应该放在哪里):
[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
并且还尝试将程序 class 标记为 public,但这似乎不起作用
编辑:
namespace Inovatic.SF.Windows.Facade
{
internal sealed class Facade : StatelessService
{
public Facade(StatelessServiceContext context)
: base(context)
{
var telemetryConfig = TelemetryConfiguration.Active;
telemetryConfig.InstrumentationKey = Environment.GetEnvironmentVariable("ApplicationInsightsKey");
FabricTelemetryInitializerExtension.SetServiceCallContext(context);
}
/// <summary>
/// Optional override to create listeners (like tcp, http) for this service instance.
/// </summary>
/// <returns>The collection of listeners.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
var endpoints = Context.CodePackageActivationContext.GetEndpoints()
.Where(endpoint => endpoint.Protocol == EndpointProtocol.Http
|| endpoint.Protocol == EndpointProtocol.Https);
return endpoints.Select(endpoint => new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, endpoint.Name, (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");
return new WebHostBuilder()
.UseKestrel(options =>
{
if (endpoint.Protocol == EndpointProtocol.Http)
options.Listen(IPAddress.Any, endpoint.Port);
else if (endpoint.Protocol == EndpointProtocol.Https)
options.Listen(IPAddress.Any, endpoint.Port,
listenOptions => listenOptions.UseHttps(Certificates.GetCertificateFromLocalStore(
Environment.GetEnvironmentVariable("ClusterCertifThumbprint"))));
})
.ConfigureServices(
services =>
{
services
.AddSingleton(new ConfigSettings())
.AddSingleton(serviceContext)
.AddSingleton(new HttpClient())
.AddSingleton(new FabricClient());
})
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseEnvironment(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"))
.UseUrls(url)
.UseApplicationInsights()
.Build();
}), endpoint.Name));
}
}
}
您必须创建 Facade
class public 并删除 sealed
关键字(因为 autofac 创建了一个继承自您的代理 class class.如果被封禁了).
所以改变
internal sealed class Facade : StatelessService
到
public class Facade : StatelessService
那你就不需要这个了
[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
我正在尝试在我的 api 中添加一些 IoC,但一直出现此错误:
The type Inovatic.SF.Windows.Facade.Facade cannot be dynamically proxied. Service types must not be sealed and need to be visible to the DynamicProxyGenAssembly2 assembly. This can be achieved by making the type public or adding the InternalsVisibleToAttribute to the assembly containing the type. e.g. [assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
program.cs:
//[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
namespace Inovatic.SF.Windows.Facade
{
internal static class Program
{
/// <summary>
/// This is the entry point of the service host process.
/// </summary>
private static void Main()
{
try
{
var builder = new ContainerBuilder();
builder.RegisterModule(new GlobalAutofacModule());
builder.RegisterServiceFabricSupport();
builder.RegisterStatelessService<Facade>("Inovatic.SF.Windows.FacadeType");
using (builder.Build())
{
ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Facade).Name);
Thread.Sleep(Timeout.Infinite);
}
}
catch (Exception e)
{
ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
throw;
}
}
}
public class GlobalAutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ConfigSettings>();
builder.RegisterType<PaymentRepository>().As<IPaymentRepository>();
}
}
}
我试过把它放在那里(但不确定它应该放在哪里):
[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
并且还尝试将程序 class 标记为 public,但这似乎不起作用
编辑:
namespace Inovatic.SF.Windows.Facade
{
internal sealed class Facade : StatelessService
{
public Facade(StatelessServiceContext context)
: base(context)
{
var telemetryConfig = TelemetryConfiguration.Active;
telemetryConfig.InstrumentationKey = Environment.GetEnvironmentVariable("ApplicationInsightsKey");
FabricTelemetryInitializerExtension.SetServiceCallContext(context);
}
/// <summary>
/// Optional override to create listeners (like tcp, http) for this service instance.
/// </summary>
/// <returns>The collection of listeners.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
var endpoints = Context.CodePackageActivationContext.GetEndpoints()
.Where(endpoint => endpoint.Protocol == EndpointProtocol.Http
|| endpoint.Protocol == EndpointProtocol.Https);
return endpoints.Select(endpoint => new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, endpoint.Name, (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");
return new WebHostBuilder()
.UseKestrel(options =>
{
if (endpoint.Protocol == EndpointProtocol.Http)
options.Listen(IPAddress.Any, endpoint.Port);
else if (endpoint.Protocol == EndpointProtocol.Https)
options.Listen(IPAddress.Any, endpoint.Port,
listenOptions => listenOptions.UseHttps(Certificates.GetCertificateFromLocalStore(
Environment.GetEnvironmentVariable("ClusterCertifThumbprint"))));
})
.ConfigureServices(
services =>
{
services
.AddSingleton(new ConfigSettings())
.AddSingleton(serviceContext)
.AddSingleton(new HttpClient())
.AddSingleton(new FabricClient());
})
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseEnvironment(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"))
.UseUrls(url)
.UseApplicationInsights()
.Build();
}), endpoint.Name));
}
}
}
您必须创建 Facade
class public 并删除 sealed
关键字(因为 autofac 创建了一个继承自您的代理 class class.如果被封禁了).
所以改变
internal sealed class Facade : StatelessService
到
public class Facade : StatelessService
那你就不需要这个了
[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]