如何将内部类与依赖项注入一起使用



我的解决方案的结构如下

API->BusinessLogic-DataAccess

API使用业务逻辑所拥有的服务。例如项目服务。该服务具有一个具有以下签名Task<ProjectGetDto>GetProjectById(int id)的方法。现在我意识到我的服务不能重复使用。因此,我添加了一个额外的"层",即位于API和业务逻辑之间的门面层。业务逻辑现在只真正处理实体。facade将这些实体转换为供API使用的Dtos。这些服务现在是更多的存储库(我将重命名它们(。这意味着我可以在整个业务逻辑中重用这些存储库。

我正在努力解决的问题是,从技术上讲,任何东西都可以使用这种业务逻辑。我有点想隐藏那些存储库,这样只有门面才能看到/使用它们。在该项目之外,任何东西都不应该能够使用这些存储库。没有什么可以阻止API注入存储库并直接使用它。所以我开始研究内部类。然而,通过依赖项注入,我只看到了如何使其工作。

我添加了一个扩展方法来添加业务逻辑中所需的存储库。知道API看不到它们。但是,如果我试图将存储库注入到立面中,我会收到一个错误,指出注入类的可访问性不如尝试使用它的类

我觉得依赖注入阻止了我封装我的代码

我现在解决这些问题的方法是将立面层作为一个新项目API引用facade项目,facade现在引用业务逻辑。然而,我仍然觉得业务逻辑没有被封装,因为它仍然可以以我不希望的方式使用

我找到了问题的答案
我可以使用以下模式来实现我想要的。

在具有内部类的程序集中:

namespace AssemblyOne {
public interface IEmployeeRepo {
void Insert();
void Update();
}

internal class DBEmployeeRepo: IEmployeeRepo {

public void Insert() {}
public void Update() {}
}

public class EmployeeFacade: IEmployeeRepo {
private readonly IEmployeeRepo _repo;
public EmployeeFacade(IEmployeeRepo repo) => _repo = repo;
public Insert() => _repo.Insert();
public Update() => _repo.Update();
}

public static class Setup
{
public static IServiceCollection SetupShared(this IServiceCollection services, IConfiguration config)
{
return services
.AddScoped<IEmployeeRepo>(sp => new EmployeeFacade(new DBEmployeeRepo()))
;
}
}   
}

在具有依赖项注入设置的程序集中:

using AssemblyOne;
namespace AssemblyTwo.Web {

public class Startup {
publci IConfiguration Config;
public Startup(IConfiguration config) => Config = config;
public void ConfigureServices(IServiceCollection services)
{
services.SetupShared(Config);
}
}
public class WorkService {
private readonly IEmployeeRepo _repo;
public WorkService(IEmployeeRepo repo) => _repo = repo;
public void DoSomething() {
_repo.Insert();
}
}
}

最新更新