如何在多个项目中使用 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
我担心的是,
我怎样才能做到这一点?我想使用 RepositoryFactory 仅在 MyApp.Data 项目中获取 Repository 实现。
由于我的 UI (MVC) 应用程序已经在执行引导程序,我是否需要将容器传递给 MyApp.Data 项目或数据项目需要其自己的容器注册逻辑? .
我也想单独测试我的 MyApp.Data 项目(没有 UI 项目依赖)。
如果可能,请提供此场景的工作代码。
提前致谢
我找到了使用 AbstractFactory 模式与简单注入器容器结合使用的解决方案 class 来解决这个问题。
我仍然不确定这是否是解决此问题的合适方法
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));
}
}
在 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 引导程序中调用。
下面是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();
}
}
我的解决方案中有 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
我担心的是,
我怎样才能做到这一点?我想使用 RepositoryFactory 仅在 MyApp.Data 项目中获取 Repository 实现。
由于我的 UI (MVC) 应用程序已经在执行引导程序,我是否需要将容器传递给 MyApp.Data 项目或数据项目需要其自己的容器注册逻辑? .
我也想单独测试我的 MyApp.Data 项目(没有 UI 项目依赖)。
如果可能,请提供此场景的工作代码。
提前致谢
我找到了使用 AbstractFactory 模式与简单注入器容器结合使用的解决方案 class 来解决这个问题。
我仍然不确定这是否是解决此问题的合适方法
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)); } }
在 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 引导程序中调用。
下面是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(); } }