我是存储库模式的新手,并尝试在我的项目中实现它。 我有实体类准入.cs
public class Admission
{
public long AccountID { get; set; }
public long ClientID { get; set; }
public long AdmissionID { get; set; }
}
然后我有这样的界面:
namespace Common.Interfaces
{
public interface IAdmissionLogic:IDisposable
{
Admission GetAdmission(long admissionId);
void UpdateAdmission(Admission admission);
}
}
然后我在不同的项目中有业务逻辑类,如下所示:
public class AdmissionLogic:IAdmissionLogic
{
private IAdmissionRepository data;
public AdmissionLogic()
{
var dependencyContainer = new UnityContainer().LoadConfiguration();
dependencyContainer.RegisterType(typeof(IAdmissionLogic));
data = dependencyContainer.Resolve<IAdmissionRepository>();
}
public void Dispose()
{
data.Dispose();
}
}
然后我在数据项目中具有接口,如下所示:
namespace Data.Interfaces
{
public interface IAdmissionRepository:IDisposable
{
CommonEntities.Admission GetAdmission(long admissionId);
void UpdateAdmission(CommonEntities.Admission admission);
}
}
然后我在与上述项目相同的项目中具有实际的存储库类:
namespace Data.Repositories
{
public class AdmissionRepository : EntitiesRepositoryBase<Data.Admission, CommonEntities.Admission>, IAdmissionRepository
{
public CommonEntities.Admission GetAdmission(long admissionId)
{
}
}
}
当我在我正在查询的实际 aspx 页面中编写以下行时;
AdmissionLogic admissionLogic = new AdmissionLogic();
Admission admission = admissionLogic.GetAdmission(AdmissionId);
我进入招生逻辑为: 当前类型"IAdmissionRepository"是一个接口,无法构造。是否缺少类型映射? 我在这里做错了什么?
注册部分似乎不正确。您正在注册IAdmissionLogic
但没有实现。然后,您永远不会解析IAdmissionLogic
组件,而是解析IAdmissionRepository
。 相反,您应该使用其实现类型注册存储库。
dependencyContainer.RegisterType<IAdmissionRepository, AdmissionRepository>();
此外,您的注册码应转到组合根目录(每个应用程序一次(,而不是在实现业务逻辑的类中。有关说明,请参阅 http://blog.ploeh.dk/2011/07/28/CompositionRoot/。
dependencyContainer.RegisterType(typeof(IAdmissionLogic));
这里可能有两个问题。
a( 您应该注册具体类型(即.class(,而不是接口。
b( 你不应该在AdmissionLogic
的构造函数中这样做(否则它会运行很多次(。
您的dependencyContainer
应该在启动时创建一次(并分配给static
变量(。注册应同时设置(一次,而不是重复(。