I have implemented a generic UnitOfWork and a generic Repository pattern in my application. I had it working so far, but some random change is not breaking a part of the code.
Below are the snippets from my code:
Generic UnitOfWork<TContext> class:
public sealed class UnitOfWork<TContext> : IDisposable, IUnitOfWork<TContext> where TContext : IDbContext//, new()
{
private static readonly ILog Log = LogManager.GetLogger(typeof(UnitOfWork<TContext>));
private readonly IDbContext _dbContext;
private Dictionary<string, IRepository> _repositories;
private IDbTransaction Transaction { get; set; }
public UnitOfWork(IDbContext context)
{
_dbContext = context;
}
public IGenericRepository<TEntity> GetRepository<TEntity>() where TEntity : class
{
if (_repositories == null)
_repositories = new Dictionary<string, IRepository>();
var repositoryName = typeof(TEntity).Name;
if (_repositories.ContainsKey(repositoryName))
return (IGenericRepository<TEntity>)_repositories[repositoryName];
var repositoryType = typeof(GenericRepository<,>);
var constructedType = repositoryType.MakeGenericType(typeof(TContext), typeof(TEntity));
var repositoryInstance = Activator.CreateInstance(constructedType, _dbContext);
_repositories.Add(repositoryName, repositoryInstance as IRepository);
return (IGenericRepository<TEntity>)_repositories[repositoryName];
}
}
GenericRepository<TContext, TEntity> class:
public class GenericRepository<TContext, TEntity> : IGenericRepository<TEntity>
where TEntity : class
where TContext : IDbContext
{
private readonly TContext _dbContext;
public GenericRepository(TContext context)
{
_dbContext = context;
}
}
I am invoking the GetRepository method as below:
_genevaPositionRepository = _reconciliationUoW.GetRepository<GenevaPosition>();
When I do so, I get an exception at the line where I try to create instance of the GenericRepository using Activator.CreateInstance().
Exception:
System.MissingMethodException occurred
HResult=0x80131513
Message=Constructor on type 'AQR.Framework.Core.UnitOfWork.GenericRepository`2[[BoxedPositionReconciliation.Services.DataContext.ReconciliationDbContext, BoxedPositionReconciliation.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[BoxedPositionReconciliation.Models.GenevaPosition, BoxedPositionReconciliation.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' not found.
Source=mscorlib
StackTrace:
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, Object[] args)
at AQR.Framework.Core.UnitOfWork.UnitOfWork`1.GetRepository[TEntity]() in C:\AQR_GIT\BoxedPositionReconciliation\AQR.Framework.Core\UnitOfWork\UnitOfWork.cs:line 41
at BoxedPositionReconciliation.Services.Service.ReconPositionService..ctor(IApplicationSettings applicationSettings, IWorkflowService workflowService, ISecurityMasterService secMasterService, ITaskStatusHistoryService taskStatusHistoryService, ICommentsService commentsService, IUnitOfWork`1 reconciliationUoW, IUnitOfWork`1 referenceDataUoW, IUnitOfWork`1 genevaDataUoW, IUnitOfWork`1 openStaarsUoW) in C:\AQR_GIT\BoxedPositionReconciliation\BoxedPositionReconciliation.Services\Service\ReconPositionService.cs:line 70
at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
I am finding it hard to resolve this problem, but I am sure it must be an easy fix, because the code worked earlier.
User contributions licensed under CC BY-SA 3.0