Asp.net web api &引用;IUnitOfWork类型没有可访问的构造函数";使用Umbraco 6.1、Umbraco API控制器(Web API)和;依赖注入(Unity)

Asp.net web api &引用;IUnitOfWork类型没有可访问的构造函数";使用Umbraco 6.1、Umbraco API控制器(Web API)和;依赖注入(Unity),asp.net-web-api,unity-container,unit-of-work,umbraco6,Asp.net Web Api,Unity Container,Unit Of Work,Umbraco6,我使用的是带有UmbracoApiController的umbraco6.1,它的构造函数中注入了IUnitOfWork。为了注入依赖项,我使用Unity,就像我过去使用标准WebAPI项目一样。通常,我在Global.asax.cs中设置unity。由于Umbraco没有此功能,我创建了自己的UmbracoEvents处理程序,该处理程序继承自iaapplicationeventhandler,并具有以下方法: 应用程序初始化 OnApplicationStarting OnApplicati

我使用的是带有UmbracoApiController的umbraco6.1,它的构造函数中注入了IUnitOfWork。为了注入依赖项,我使用Unity,就像我过去使用标准WebAPI项目一样。通常,我在Global.asax.cs中设置unity。由于Umbraco没有此功能,我创建了自己的UmbracoEvents处理程序,该处理程序继承自iaapplicationeventhandler,并具有以下方法:

  • 应用程序初始化
  • OnApplicationStarting
  • OnApplicationStarted
  • 配置API
  • 在OnApplicationStarted方法中,我设置了EF数据库、db初始值设定项等,并调用ConfigureApi来设置Unity。我的OnApplication启动和配置API方法如下所示:

        public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        {
            _applicationContext = applicationContext;
            _umbracoApplication = umbracoApplication;
            _contentService = ApplicationContext.Current.Services.ContentService;
            this.ConfigureApi(GlobalConfiguration.Configuration);
            Database.SetInitializer(null);
            PropertySearchContext db = new PropertySearchContext();
            db.Database.Initialize(true);
        }
    
        private void ConfigureApi(HttpConfiguration config)
        {
            var unity = new UnityContainer();
            unity.RegisterType<PropertiesApiController>();
            unity.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());
            config.DependencyResolver = new IoCContainer(unity);
        }
    
    我的范围容器/IoC容器代码:(根据)

    public类ScopeContainer:idependencycoscope
    {
    受保护的IUnity容器;
    公共作用域容器(IUnityContainer容器)
    {
    if(容器==null)
    {
    抛出新的ArgumentNullException(“容器”);
    }
    this.container=容器;
    }
    公共对象GetService(类型serviceType)
    {
    if(容器已注册(服务类型))
    {
    返回容器解析(serviceType);
    }
    其他的
    {
    返回null;
    }
    }
    公共IEnumerable GetServices(类型serviceType)
    {
    if(容器已注册(服务类型))
    {
    返回容器.ResolveAll(serviceType);
    }
    其他的
    {
    返回新列表();
    }
    }
    公共空间处置()
    {
    container.Dispose();
    }
    }
    公共类IoCContainer:ScopeContainer、IDependencyResolver
    {
    公共IOC容器(IUnityContainer容器)
    :底座(容器)
    {
    }
    公共IDependencyScope BeginScope()
    {
    var child=this.container.CreateChildContainer();
    返回新的ScopeContainer(子容器);
    }
    }
    
    我的IUnitOfWork代码:

    public interface IUnitOfWork : IDisposable
    {
        GenericRepository<Office> OfficeRepository { get; }
        GenericRepository<Property> PropertyRepository { get; }
        void Save();
        void Dispose(bool disposing);
        void Dispose();
    }
    
    公共接口IUnitOfWork:IDisposable
    {
    通用存储办公室存储{get;}
    GenericRepository属性Repository{get;}
    作废保存();
    无效处置(bool处置);
    无效处置();
    }
    
    我的UnitOfWork实现:

    public class UnitOfWork : IUnitOfWork
    {
        private readonly PropertySearchContext _context = new PropertySearchContext();
        private GenericRepository<Office> _officeRepository;
        private GenericRepository<Property> _propertyRepository;
    
        public GenericRepository<Office> OfficeRepository
        {
            get
            {
    
                if (this._officeRepository == null)
                {
                    this._officeRepository = new GenericRepository<Office>(_context);
                }
                return _officeRepository;
            }
        }
        public GenericRepository<Property> PropertyRepository
        {
            get
            {
    
                if (this._propertyRepository == null)
                {
                    this._propertyRepository = new GenericRepository<Property>(_context);
                }
                return _propertyRepository;
            }
        }
    
        public void Save()
        {
            _context.SaveChanges();
        }
    
        private bool disposed = false;
    
        public virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    _context.Dispose();
                }
            }
            this.disposed = true;
        }
    
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
    
    公共类UnitOfWork:IUnitOfWork
    {
    私有只读PropertySearchContext _context=new PropertySearchContext();
    私人总储蓄所(办公室储蓄所);;
    私人一般储蓄(不动产储蓄);;
    公共总储蓄所
    {
    得到
    {
    if(this.\u officepositionory==null)
    {
    此._officeposition=新的一般存储(_上下文);
    }
    返回办公地点;
    }
    }
    公共一般存储属性存储
    {
    得到
    {
    if(this.\u propertyRepository==null)
    {
    此._propertyRepository=新的通用存储(_上下文);
    }
    归还财产存储;
    }
    }
    公共作废保存()
    {
    _SaveChanges();
    }
    私有布尔=假;
    公共虚拟无效处置(bool处置)
    {
    如果(!this.disposed)
    {
    如果(处置)
    {
    _context.Dispose();
    }
    }
    这是真的;
    }
    公共空间处置()
    {
    处置(真实);
    总干事(本);
    }
    }
    
    我已经在MVC4/WebAPI控制器和UnitOfWork的这个实现中使用unity/DI很多次了,所以我认为它是Umbraco特有的

    我还调试了应用程序,确保它在ApplicationStarted上运行,并且其参数不为null

    控制器中的GetAllProperties方法只是一种测试方法,用于确保其正常工作,但是,当我尝试访问此操作时,会出现以下错误:

    “类型IUnitOfWork没有可访问的构造函数”

    有没有人有使用Umbraco 6.1和它的带有依赖注入/统一的Umbraco apicontroller的经验

    另外,另一个不相关的注意事项是,是否有一种方法可以在操作中返回JSON而不是XML?在Web API中,您只需在WebApi.config中定义格式化程序,但在Umbraco中没有

    谢谢,
    贾斯汀

    以防你还没有找到解决问题的方法?在构建unity容器后立即下载此文件:

    GlobalConfiguration.Configuration.DependencyResolver =
       new Unity.WebApi.UnityDependencyResolver(Bootstrapper.Container);
    

    注意与Unity.Mvc4.UnityDependencyResolver不同的名称空间

    建议1:如果将默认构造函数添加到
    UnitOfWork
    (不起任何作用)会发生什么?建议2:您看到这个问题了吗?是的,我见过。在我的ConfigureApi方法中,我正在向HierarchyCallifeTimeManager注册IUnitOfWork/UnitOfWork类型(无论如何我都会这样做)。另外,我注册的是一个类型,而不是一个实例。也许我需要为控制器注册一个实例。实际上,我并没有像我所想的那样,在编译时明确声明一个空构造函数,但它还是使用了它?无论如何,我会尝试这样做,并报告:“我不希望空白构造函数建议工作,但是如果显然是解决方案的东西,你花了很多时间试图找到更高级的错误,那将是愚蠢的:”如果你的容器不知道IUnitOfWork和UNITOFWork之间的映射,就会发生这种情况。它试图直接实例化IUnitOfWork,这是不可能的,因为它是一个接口。确保正确注册依赖项。
    public class UnitOfWork : IUnitOfWork
    {
        private readonly PropertySearchContext _context = new PropertySearchContext();
        private GenericRepository<Office> _officeRepository;
        private GenericRepository<Property> _propertyRepository;
    
        public GenericRepository<Office> OfficeRepository
        {
            get
            {
    
                if (this._officeRepository == null)
                {
                    this._officeRepository = new GenericRepository<Office>(_context);
                }
                return _officeRepository;
            }
        }
        public GenericRepository<Property> PropertyRepository
        {
            get
            {
    
                if (this._propertyRepository == null)
                {
                    this._propertyRepository = new GenericRepository<Property>(_context);
                }
                return _propertyRepository;
            }
        }
    
        public void Save()
        {
            _context.SaveChanges();
        }
    
        private bool disposed = false;
    
        public virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    _context.Dispose();
                }
            }
            this.disposed = true;
        }
    
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
    
    GlobalConfiguration.Configuration.DependencyResolver =
       new Unity.WebApi.UnityDependencyResolver(Bootstrapper.Container);