我的解决方案中有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类的实例
我担心的是,
我怎么能做到这一点?我想使用RepositoryFactory仅在MyApp.Data项目中获取Repository实现。
由于我的UI(MVC)应用程序已经在使用引导带,我是否需要将容器传递给MyApp.Data项目或Data项目需要自己的容器注册逻辑?
我还想单独测试我的MyApp.Data项目(没有UI项目依赖项)。
如果可能,请为此方案提供有效的代码。
先谢谢
答案 0 :(得分:0)
我找到了一个解决方案,使用AbstractFactory模式与简单注入器容器类一起使用来解决这个问题。
我仍然不确定这是否是解决此问题的合适解决方案
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类,用于注册数据层依赖项。
所以这可以从我的单元测试用例和UI bootstraper中调用。
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>();
}
}
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>();
}
}