ServiceStack使用Funq方言(不支持元数据),其中Kephas使用MEF/Autofac之一(需要元数据支持)。我的问题有两部分:
IClientCache)可供Kephas组件使用,同时知道此类服务可能不带[AppServiceContract]注释发布于 2019-09-06 20:27:20
通过选择使用Autofac,可以使ASP.NET和Kephas使用一个容器。但是,正如@神话所指出的,您需要为Autofac IoC适配器提供ServiceStack。我不认为ASP.NET在这样做时会有任何问题,因为Autofac是ASP.NET核心团队的第一条建议。
对于ASP.NET核心,如果需要进行所有设置,请引用Kephas.AspNetCore包并从StartupBase类继承。但是,如果您需要控制,请查看https://github.com/kephas-software/kephas/blob/master/src/Kephas.AspNetCore/StartupBase.cs并编写您自己的启动类。您可能认为有用的另一个资源是Kephas.ServiceStack集成包。
然后,除了注释服务契约和服务实现之外,Kephas还允许您通过实现IAppServiceInfoProvider接口来提供服务定义。这些类是自动发现的,所以这几乎是您必须做的一切。
public class ServiceStackAppServiceInfoProvider : IAppServiceInfoProvider
{
public IEnumerable<(Type contractType, IAppServiceInfo appServiceInfo)> GetAppServiceInfos(IList<Type> candidateTypes, ICompositionRegistrationContext registrationContext)
{
yield return (typeof(IUserAuthRepository),
new AppServiceInfo(
typeof(IUserAuthRepository),
AppServiceLifetime.Singleton));
yield return (typeof(ICacheClient),
new AppServiceInfo(
typeof(ICacheClient),
ctx => new MemoryCacheClient(),
AppServiceLifetime.Singleton));
}
}注意,在上面的示例中,对于IUserAuthRepository,没有提供任何实现。这表明Kephas自动发现为组合注册的类型中的实现。或者,如果您需要确定性,可以在注册中使用实例或工厂。
发布于 2019-09-02 14:43:41
我以前从未听说过Kephas,但如果您指的是这个基于GitHub的Kephas框架,它说它使用ASP.NET核心,在这种情况下最好让它们都使用ASP.NET Core的IOC,您可以通过在应用程序启动时在ConfigureServices中注册依赖项来做到这一点:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
//...
}
}或者,在ServiceStack为模块启动发布的最新版本5.6中,将ASP.NET核心启动类更改为从ModularStartup继承,例如:
public class Startup : ModularStartup
{
public Startup(IConfiguration configuration) : base(configuration){}
public new void ConfigureServices(IServiceCollection services)
{
//...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...
}
}在这种情况下,您可以通过在AppHost的Configure(IServiceCollection)中注册它们来实现Configure(IServiceCollection),在这里可以通过ASP.NET Core的IOC +ServiceStack的IOC解析它们,例如:
public class AppHost : AppHostBase
{
public override void Configure(IServiceCollection services)
{
services.AddSingleton<IRedisClientsManager>(
new RedisManagerPool(Configuration.GetConnectionString("redis")));
}
public override void Configure(Container container)
{
var redisManager = container.Resolve<IRedisClientsManager>();
//...
}
}https://stackoverflow.com/questions/57757756
复制相似问题