2012-07-21 2 views
0

У меня есть IRequestManager класса, устраняющие к классу RequestManager, но я получаю System.IO.FileLoadException было необработанным с помощью кода пользователя Message = Данное имя сборки или кодовой было инвалид. (Исключение из HRESULT: 0x80131047)Unity 2.0: как разрешить зависимости конструктора

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

У меня возникли проблемы регистрирующий IRequestManager в моем web.config; мне нужно создать явно зарегистрировать IRepository в web.config?

Вот мой 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> 

Моя текущая работа вокруг вручную создать новый экземпляр RequestManager в моей службы WCF и передать в разрешённых параметров конструктора, как показано ниже:

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

Оказалось, что это глупая ошибка ... В узле register в файле web.config для MRF.Interfaces.IRequestManager я использовал пространство имен вместо имени проекта!

После того, как я исправил файл 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

Просто уточнение - атрибут Type в вашем примере ищет полное имя типа и _assembly name_, а не название проекта. По умолчанию имя проекта будет использоваться как имя сборки, но важно различать, потому что они не должны быть одинаковыми. –

+0

Спасибо за головы. Я лично не большой поклонник Unity, но я должен использовать его на работе. Если бы у меня был выбор, я бы использовал Ninject. – Abe

Смежные вопросы