首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我必须将ServiceStack与Kephas集成在一起。我如何让他们一起玩依赖注入?

我必须将ServiceStack与Kephas集成在一起。我如何让他们一起玩依赖注入?
EN

Stack Overflow用户
提问于 2019-09-02 13:23:30
回答 2查看 50关注 0票数 1

ServiceStack使用Funq方言(不支持元数据),其中Kephas使用MEF/Autofac之一(需要元数据支持)。我的问题有两部分:

  • 如果可以的话,如何使ServiceStack和Kepha使用一个DI容器?
  • 取决于上面的答案:如何使ServiceStack服务(如IClientCache)可供Kephas组件使用,同时知道此类服务可能不带[AppServiceContract]注释
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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接口来提供服务定义。这些类是自动发现的,所以这几乎是您必须做的一切。

代码语言:javascript
复制
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自动发现为组合注册的类型中的实现。或者,如果您需要确定性,可以在注册中使用实例或工厂。

票数 2
EN

Stack Overflow用户

发布于 2019-09-02 14:43:41

我以前从未听说过Kephas,但如果您指的是这个基于GitHub的Kephas框架,它说它使用ASP.NET核心,在这种情况下最好让它们都使用ASP.NET Core的IOC,您可以通过在应用程序启动时在ConfigureServices中注册依赖项来做到这一点:

代码语言:javascript
复制
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        //...
    }
}

或者,在ServiceStack为模块启动发布的最新版本5.6中,将ASP.NET核心启动类更改为从ModularStartup继承,例如:

代码语言:javascript
复制
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解析它们,例如:

代码语言:javascript
复制
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>();
        //...
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57757756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档