当前类型," IAdmissionRepository,"是一个接口,无法构造。你错过了类型映射吗?

时间:2017-07-17 13:54:16

标签: c# interface repository-pattern

我是存储库模式的新手,并试图在我的项目中实现它。 我有实体类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;是一个接口,无法构造。你错过了类型映射吗? 我在这里做错了什么?

2 个答案:

答案 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/