Разрешить динамический прокси EF в Autofac - PullRequest
1 голос
/ 08 марта 2019

Я использую Entity Framework и зарегистрировал некоторые типы для использования в фабричном классе.

Регистрация выполняется с использованием Keyed, например:

builder.RegisterType<CreateTypeAStrategy>().Keyed<ICreateWorkItemsStrategy>(typeof(TypeA));

Здесь TypeAявляется сущностью.

Я разрешаю так (действие имеет тип TypeA):

var strategy = scope.ResolveKeyed<ICreateWorkItemsStrategy>(action.GetType(), new TypedParameter(action.GetType(), action));

Я получаю ожидаемое ComponentNotRegisteredException, поскольку proxy не зарегистрировано, толькоКонкретный класс is.

Интерфейс и стратегия объявлены так:

public interface ICreateWorkItemsStrategy
{
    IEnumerable<IWorkItem> CreateWorkItems();
}

public class CreateTypeAStrategy : ICreateWorkItemsStrategy
{
    public CreateTypeAStrategy(TypeA typeA)
    {

    }
    public IEnumerable<IWorkItem> CreateWorkItems()
    {
        throw new System.NotImplementedException();
    }
}

Любые предложения о том, как решить, используя прокси EF?

Полностью рабочий пример (необходимоEF и Autofac nuget):

public class ApplicationDbContext : DbContext
{
    public virtual DbSet<TypeA> TypeAs { get; set; }
    public virtual DbSet<RefForProxy> Refs { get; set; }
}

public class RefForProxy
{
    public int Id { get; set; }
}

public class TypeA
{
    public int Id { get; set; }
    public virtual RefForProxy Ref { get; set; }
}

public interface ICreateWorkItemsStrategy
{
    IEnumerable<object> CreateWorkItems();
}

public class CreateTypeAStrategy : ICreateWorkItemsStrategy
{
    public CreateTypeAStrategy(TypeA typeA)
    {

    }
    public IEnumerable<object> CreateWorkItems()
    {
        throw new NotImplementedException();
    }
}

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<CreateTypeAStrategy>().Keyed<ICreateWorkItemsStrategy>(typeof(TypeA));
        var container = builder.Build();

        int a_id;
        using (var ctx = new ApplicationDbContext())
        {

            var a = new TypeA { Ref = new RefForProxy() };
            ctx.TypeAs.Add(a);
            ctx.SaveChanges();
            a_id = a.Id;
        }

        using (var ctx = new ApplicationDbContext())
        {
            var aProxy = ctx.TypeAs.SingleOrDefault(x => x.Id == a_id);

            var strategy = container.ResolveKeyed<ICreateWorkItemsStrategy>(aProxy.GetType(), new TypedParameter(aProxy.GetType(), aProxy));
        }
    }
}

1 Ответ

1 голос
/ 08 марта 2019

ObjectContext.GetObjectType - это метод, который вам нужен.

Возвращает тип сущности объекта POCO, связанного с прокси-объектом указанного типа.

Он также возвращает тип POCO, если указанный тип не являетсяпрокси, но тип POCO.

Type t = ObjectContext.GetObjectType(aProxy.GetType()); 
var strategy = container.ResolveKeyed<ICreateWorkItemsStrategy>(t, new TypedParameter(t, aProxy));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...