0

RequestManagerクラスに解決されるIRequestManagerクラスがありますが、System.IO.FileLoadException was unhandled by user code Message=The given assembly name or codebase was invalid を取得しています。(HRESULT からの例外: 0x80131047)

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);
}
4

1 に答える 1

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" />
于 2012-07-21T23:32:28.750 に答える