如何使用具有多个项目的简单注入器并传递以解决依赖关系

时间:2017-12-06 12:34:48

标签: simple-injector

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

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

Private Sub dgvCalibration_UserDeletedRow(sender As System.Object, e As System.Windows.Forms.DataGridViewRowEventArgs) Handles dgvCalibration.UserDeletedRow

    Dim intDelRow As Integer
    intDelRow = e.Row.Cells(0).Value()

现在在我的Data项目中,我想创建抽象存储库工厂,它返回相应存储库接口的具体实现,此类仅在MyApp.Data项目中使用, 例如public class RepositoryA: IRepositoryBase, IRepositoryA { ..... } public class RepositoryB: IRepositoryBase, IRepositoryB { ..... } 必须返回RepositoryA类的实例,或者RepositoryFactory.GetRepository<IRepositoryA>()必须返回RepositoryB类的实例

我担心的是,

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

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

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

  4. 如果可能,请为此方案提供有效的代码。

    先谢谢

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,使用AbstractFactory模式与简单注入器容器类一起使用来解决这个问题。

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

  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类,用于注册数据层依赖项。

  3. 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 bootstraper中调用。

    1. 以下是工厂用法示例 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>(); } }
相关问题