如何在多个项目中使用 simple-injector 并传递以解决依赖关系

How to use simple-injector with multiple projects and pass to resolve the dependencies

我的解决方案中有 4 个项目, 1. MyApp.UI (MVC) 2. MyApp.Core(类库) 3. MyApp.Data(带有 EF 实现的类库)和 4.MyApp.Tests

在我的数据项目中,我有 4 个存储库实现,所有 4 个存储库都实现了 IRepositoryBase 接口和它们自己的存储库接口示例,

public class RepositoryA: IRepositoryBase, IRepositoryA
{
.....
}
public class RepositoryB: IRepositoryBase, IRepositoryB
{
.....
}

现在在我的数据项目中,我想创建 抽象存储库工厂,其中 returns 相应存储库接口的具体实现和 this class 仅在 MyApp.Data 项目 中使用, 例如 RepositoryFactory.GetRepository<IRepositoryA>() 必须 returns RepositoryA 的实例 class 或 RepositoryFactory.GetRepository<IRepositoryB>() 必须 returns RepositoryB 的实例 class

我担心的是,

  1. 我怎样才能做到这一点?我想使用 RepositoryFactory 仅在 MyApp.Data 项目中获取 Repository 实现。

  2. 由于我的 UI (MVC) 应用程序已经在执行引导程序,我是否需要将容器传递给 MyApp.Data 项目或数据项目需要其自己的容器注册逻辑? .

  3. 我也想单独测试我的 MyApp.Data 项目(没有 UI 项目依赖)。

如果可能,请提供此场景的工作代码。

提前致谢

我找到了使用 AbstractFactory 模式与简单注入器容器结合使用的解决方案 class 来解决这个问题。

我仍然不确定这是否是解决此问题的合适方法

  1. DataRepositoryFactory 实现,

    //Abstract data repository factory
    public interface IDataRepositoryFactory
    {
        T GetDataRepository<T>() where T : IDataRepository;
    }
    public class DataRepositoryFactory : IDataRepositoryFactory
    {
        T IDataRepositoryFactory.GetDataRepository<T>()
        {
            return (T)DataBootStraper
                     .DataDIContainer
                     .GetInstance(typeof(T));
        }
    }  
    
  2. 在 MyApp.Data 项目中我创建了静态 Bootstrap class 用于注册数据层依赖项。

    public static class DataBootStraper
    {
        public static void BootStrap(Container container)
        {
            container.Register<IRepositoryA, RepositoryA>();
            container.Register<IRepositoryB, RepositoryB>();
            container.Register<IRepositoryC, RepositoryC>();
            //Register the DataRepositoryFactory also with container
            container.Register<IDataRepositoryFactory, DataRepositoryFactory>();
        }
    }
    

所以这可以从我的单元测试用例以及 UI 引导程序中调用。

  1. 下面是factory的用法示例

    public class DataRepositoryFactoryTest
    {
        private readonly IDataRepositoryFactory _repositoryFactory;
        public DataRepositoryFactoryTest(IDataRepositoryFactory repositoryFactory)
        {
            _repositoryFactory = repositoryFactory;
        }
        public IEnumerable<RepoAEntities> GetEntitiesFromRepoA()
        {
            return _repositoryFactory.GetDataRepository<IRepositoryA>().GetEntities();
        }
        public IEnumerable<RepoBEntities> GetEntitiesFromRepoB()
        {
            return _repositoryFactory.GetDataRepository<IRepositoryB>().GetEntities();
        }
        public IEnumerable<RepoCEntities> GetEntitiesFromRepoC()
        {
            return _repositoryFactory.GetDataRepository<IRepositoryC>().GetEntities();
        }
    }