小编Max*_*nas的帖子

如何在 C# 中使用带有继承的依赖注入

介绍

大家好,我目前正在使用 C# 开发一个持久性库。在那个库中,我已经实现了存储库模式,我遇到了一个 SOLID 问题。这是我当前实现的一个简化示例,重点关注基本要素:

持久化库中包含的抽象存储库:

public abstract class Repository<T> 
{
    protected Repository(
        IServiceA serviceA,
        IServiceB serviceB) 
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

库用户创建的具体存储库:

public class FooRepository : Repository<Foo> 
{
    protected FooRepository(
        IServiceA serviceA,
        IServiceB serviceB) :
        base(serviceA, serviceB)
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

好的,使用当前代码,派生类必须知道基类的每个依赖项都可以,但是如果我向基类添加依赖项怎么办?每个派生类都会中断,因为它们需要将新的依赖项传递给基类......所以目前,我被限制永远不会改变基类构造函数,这是一个问题,因为我希望我的基类有可能发展。这个实现显然打破了开放/封闭原则,但我不知道如何在不打破 SOLID 的情况下解决这个问题......

要求

  • 该库应该易于用户使用
  • 具体的存储库应该能够通过 DI 构建
  • 应将一个或多个依赖项添加到抽象存储库中,而不会影响派生存储库
  • 应该可以像使用控制器的ASP.NET MVC 框架一样使用命名约定在 DI 容器中注册每个存储库
  • 如果他愿意,用户应该能够在他的派生存储库中添加更多依赖项

已经设想的解决方案

1. 服务聚合模式

本文之后,服务聚合器模型可以应用于这种情况,因此代码看起来像这样:

持久化库中包含的抽象存储库:

public abstract class Repository<T> 
{ …
Run Code Online (Sandbox Code Playgroud)

c# inheritance dependency-injection solid-principles

15
推荐指数
2
解决办法
1万
查看次数

Azure AD B2C:客户在兑换机密授权时必须发送 client_secret

我尝试使用授权代码和 Azure AD B2C(客户端的 oidc-client)为 Angular 应用程序设置身份验证,但我从 Angular 收到这些错误:

在此处输入图片说明

查看 B2C 审核日志后,我发现了以下错误消息:

客户在兑换机密授权时必须发送 client_secret。

这是我的客户端配置:

const settings = {
  stsAuthority: 'https://supportodqqcdev.b2clogin.com/supportodqqcDev.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_SignUpSignInOdqPlatine',
  clientId: '8447df5b-35a0-40a7-944f-5dcce87a2193',
  clientRoot: 'https://localhost:4200',
  scope: 'openid https://supportodqqcDev.onmicrosoft.com/platineclientdev/read',
};
this.userManager = new UserManager({
  authority: settings.stsAuthority,
  client_id: settings.clientId,
  redirect_uri: `${settings.clientRoot}/signin-callback`,
  scope: settings.scope,
  response_type: 'code',
  post_logout_redirect_uri: `${settings.clientRoot}/signout-callback`,
  automaticSilentRenew: true,
  silent_redirect_uri: `${settings.clientRoot}/assets/signin-silent-callback.html`,
});
Run Code Online (Sandbox Code Playgroud)

如果我将上述配置切换为使用本地 IdentityServer 实例,则一切正常。

有人能够指出我应该在哪里或如何调查这个问题吗?

openid-connect azure-ad-b2c angular oidc-client

10
推荐指数
2
解决办法
4397
查看次数