我是存储库模式的新手,并试图在我的项目中实现它。 我有实体类Admission.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);
我将进入AdmissionLogic: 当前类型,&#34; IAdmissionRepository,&#34;是一个接口,无法构造。你错过了类型映射吗? 我在这里做错了什么?
答案 0 :(得分:0)
dependencyContainer.RegisterType(typeof(IAdmissionLogic));
这里可能有两个问题。
a)您应该注册concrete type(即类),而不是接口。
b)你不应该在AdmissionLogic
的构造函数中执行此操作(否则它将运行多次)。
您的dependencyContainer
应该在启动时创建(并分配给static
变量)。注册应该同时设置(一次,不重复)。
答案 1 :(得分:0)
注册部分似乎不正确。您正在注册IAdmissionLogic
但没有实施。然后,您永远不会解析IAdmissionLogic
组件,而是IAdmissionRepository
。
您应该使用其实现类型注册存储库。
dependencyContainer.RegisterType<IAdmissionRepository, AdmissionRepository>();
此外,您的注册码应该转到组合根(每个应用程序一次),而不是实现业务逻辑的类。有关说明,请参阅http://blog.ploeh.dk/2011/07/28/CompositionRoot/。