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