当前类型 "IAdmissionRepository," 是一个接口,无法构造。您是否缺少类型映射?
The current type, "IAdmissionRepository," is an interface and cannot be constructed. Are you missing a type mapping?
我是存储库模式的新手,正在尝试在我的项目中实现它。
我有实体 class 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);
}
}
然后我在不同的项目中有业务逻辑 class:
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);
}
}
然后我在与上述项目相同的项目中拥有实际存储库 class:
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:
当前类型 "IAdmissionRepository," 是一个接口,无法构造。您是否缺少类型映射?
我在这里做错了什么?
dependencyContainer.RegisterType(typeof(IAdmissionLogic));
这里可能有两个问题。
a) 您应该注册 concrete type(即 class),而不是界面。
b) 你不应该在 AdmissionLogic
的构造函数中这样做(否则它会 运行 很多次)。
您的 dependencyContainer
应该在启动时创建一次(并分配给 static
变量)。注册需同时设置(一次,不可重复)
注册部分似乎不正确。您正在注册 IAdmissionLogic
但没有实施。那么你永远不会解析 IAdmissionLogic
组件,而是解析 IAdmissionRepository
。
您应该改为使用其实现类型注册存储库。
dependencyContainer.RegisterType<IAdmissionRepository, AdmissionRepository>();
此外,您的注册码应该转到组合根目录(每个应用程序一次),而不是 class 实现业务逻辑。有关解释,请参阅 http://blog.ploeh.dk/2011/07/28/CompositionRoot/。
我是存储库模式的新手,正在尝试在我的项目中实现它。 我有实体 class 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);
}
}
然后我在不同的项目中有业务逻辑 class:
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);
}
}
然后我在与上述项目相同的项目中拥有实际存储库 class:
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: 当前类型 "IAdmissionRepository," 是一个接口,无法构造。您是否缺少类型映射? 我在这里做错了什么?
dependencyContainer.RegisterType(typeof(IAdmissionLogic));
这里可能有两个问题。
a) 您应该注册 concrete type(即 class),而不是界面。
b) 你不应该在 AdmissionLogic
的构造函数中这样做(否则它会 运行 很多次)。
您的 dependencyContainer
应该在启动时创建一次(并分配给 static
变量)。注册需同时设置(一次,不可重复)
注册部分似乎不正确。您正在注册 IAdmissionLogic
但没有实施。那么你永远不会解析 IAdmissionLogic
组件,而是解析 IAdmissionRepository
。
您应该改为使用其实现类型注册存储库。
dependencyContainer.RegisterType<IAdmissionRepository, AdmissionRepository>();
此外,您的注册码应该转到组合根目录(每个应用程序一次),而不是 class 实现业务逻辑。有关解释,请参阅 http://blog.ploeh.dk/2011/07/28/CompositionRoot/。