2012-07-21 66 views
0

我有一个IRequestManager类解析为RequestManager类,但我正在逐渐System.IO.FileLoadException是由用户代码未处理消息=给定的程序集名称或代码库是无效。 (异常来自HRESULT:0x80131047)统一2.0:如何解决构造依赖

public class RequestManager : IRequestManager 
{ 
    private IRepository<Request> _requestRepository; 
    public RequestManager(IRepository<Request> requestRepository) 
    { 
     _requestRepository = requestRepository; 
    } 
    // ... 
} 

我无法在我的web.config注册IRequestManager;我是否需要在web.config中显式注册IRepository?

这里是我的web.config

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
    <alias alias="PerOperationContext" type="UnityWcfExtensions.UnityOperationContextLifetimeManager, UnityWcfExtensions" /> 
    <container> 
     <register type="MRF.Repository.IDbContext, MRF.Repository" mapTo="MRF.Repository.EntityFrameworkCodeFirst.MRFDbContext, MRF.Repository.EntityFrameworkCodeFirst"> 
     <lifetime type="PerOperationContext" /> 
     <constructor> 
      <param name="nameOrConnectionString" value="MRFContext" type="string" /> 
     </constructor> 
     </register> 

     <register type="MRF.Repository.IUnitOfWorkFactory, MRF.Repository" mapTo="MRF.Repository.EntityFrameworkCodeFirst.MRFDbContext, MRF.Repository.EntityFrameworkCodeFirst"> 
     <lifetime type="PerOperationContext" /> 
     <constructor> 
      <param name="nameOrConnectionString" value="MRFContext" type="string" /> 
     </constructor> 
     </register> 

     <register type="MRF.Repository.IRepository`1, MRF.Repository" mapTo="MRF.Repository.EntityFrameworkCodeFirst.GenericRepository`1, MRF.Repository.EntityFrameworkCodeFirst" /> 
     <register type="MRF.Business.Interfaces.IRequestManager, MRF.Business.Interfaces" mapTo="MRF.Business.RequestManager, MRF.Business"> 
     <constructor> 
      <param name="requestRepository" type="MRF.Repository.IRepository`1[[MRF.Entities.Request, MRF.Entities]]"> 
      <dependency /> 
      </param> 
     </constructor> 

     </register> 
     <register type="MRF.Mapping.IMapper`2[[MRF.Entities.Region, MRF.Entities],[MRF.Service.DataContract.Region, MRF.Service.DataContract]], MRF.Mapping" mapTo="MRF.Mapping.AutoMapper.RegionMapper, MRF.Mapping.AutoMapper" /> 
     <register type="MRF.Mapping.IMapper`2[[MRF.Entities.User, MRF.Entities],[MRF.Service.DataContract.User, MRF.Service.DataContract]], MRF.Mapping" mapTo="MRF.Mapping.AutoMapper.UserMapper, MRF.Mapping.AutoMapper" /> 
     <register type="MRF.Mapping.IMapper`2[[MRF.Entities.UserPreference, MRF.Entities],[MRF.Service.DataContract.UserPreference, MRF.Service.DataContract]], MRF.Mapping" mapTo="MRF.Mapping.AutoMapper.UserPreferenceMapper, MRF.Mapping.AutoMapper" /> 
     <register type="MRF.Mapping.IMapper`2[[MRF.Entities.Status, MRF.Entities],[MRF.Service.DataContract.Status, MRF.Service.DataContract]], MRF.Mapping" mapTo="MRF.Mapping.AutoMapper.StatusMapper, MRF.Mapping.AutoMapper" /> 
     <register type="MRF.Mapping.IMapper`2[[MRF.Entities.Request, MRF.Entities],[MRF.Service.DataContract.Request, MRF.Service.DataContract]], MRF.Mapping" mapTo="MRF.Mapping.AutoMapper.RequestMapper, MRF.Mapping.AutoMapper" /> 
     <register type="MRF.Mapping.IMapper`2[[MRF.Entities.Series, MRF.Entities],[MRF.Service.DataContract.Series, MRF.Service.DataContract]], MRF.Mapping" mapTo="MRF.Mapping.AutoMapper.SeriesMapper, MRF.Mapping.AutoMapper" /> 
    </container> 
    </unity> 

我目前的解决办法是在我的WCF服务手动创建RequestManager的新实例,并通过在解决构造函数的参数,如下图所示:

public DC.Request GetRequest(int requestId) 
{ 
    var requestRepository = this.Container.Resolve<IRepository<BE.Request>>(); 
    var requestManager = new RequestManager(requestRepository); 
    var request = requestManager.GetRequest(requestId); 
    var userMapper = this.Container.Resolve<IMapper<BE.User, DC.User>>(); 
    var seriesMapper = this.Container.Resolve<IMapper<BE.Series, DC.Series>>(); 
    var statusMappger = this.Container.Resolve<IMapper<BE.Status, DC.Status>>(); 
    var mapper = this.Container.Resolve<IMapper<BE.Request, DC.Request>>(); 
    return mapper.Map(request); 
} 

回答

0

原来是一个愚蠢的错误... 在MRF.Interfaces.IRequestManager的web.config的注册节点中,我使用的是命名空间而不是项目名称!

当我纠正了web.config后,我不必添加任何额外的配置,下面的代码工作得很好!

public DC.Request GetRequest(int requestId) 
{ 
    var requestManager = this.Container.Resolve<IRequestManager>(); 
    var request = requestManager.GetRequest(requestId); 
    var userMapper = this.Container.Resolve<IMapper<BE.User, DC.User>>(); 
    var seriesMapper = this.Container.Resolve<IMapper<BE.Series, DC.Series>>(); 
    var statusMappger = this.Container.Resolve<IMapper<BE.Status, DC.Status>>(); 
    var mapper = this.Container.Resolve<IMapper<BE.Request, DC.Request>>(); 
    return mapper.Map(request); 
} 

所以,与其

<register type="MRF.Business.Interfaces.IRequestManager, MRF.Business.Interfaces" mapTo="MRF.Business.RequestManager, MRF.Business" /> 

我必须做到以下几点:

<register type="MRF.Business.Interfaces.IRequestManager, MRF.Business" mapTo="MRF.Business.RequestManager, MRF.Business" /> 
+1

只是澄清 - 在你的榜样类型属性寻找的完全限定类型名称和_assembly name_,而不是项目名称。默认情况下,项目名称将用作程序集名称,但区分很重要,因为它们不必相同。 – 2012-07-22 00:13:06

+0

谢谢你的抬头。我个人不是Unity的忠实粉丝,但我必须在工作中使用它。如果我有选择,我会使用Ninject。 – Abe 2012-07-23 16:20:34