Autofac регистрация с несколькими сборками и различными EntityConnections - PullRequest
0 голосов
/ 12 апреля 2011

У нас есть две сборки, которые содержат свои собственные объекты Entity-Framework EDMX и репозитории. Они зарегистрированы с помощью Autofac в веб-приложении ASP.NET.

Эти сборки очень похожи по архитектуре (но отличаются от EDMX). Мы обнаружили, что последнее зарегистрированное EntityConnection - это EntityConnection, которое используется в обеих сборках. Нам нужно ограничить использование EntityConnection только для использования Типами сборки или пространства имен.

var assembly = typeof(Activity).Assembly;
builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
builder.Register(reg => new EntityConnection(ConnectionString));

var assembly = typeof(User).Assembly;
builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
builder.Register(reg => new EntityConnection(ConnectionString));

Есть ли способ зарегистрировать EntityConnection и ограничить глубину EntityConnection? Ограничить каждый объект EntityConnection сборкой, к которой он принадлежит?

Вот пример псевдокода о том, как мы хотим зарегистрировать EntityConnection для использования только в сборке или пространстве имен.

builder.Register(reg => new EntityConnection(ConnectionString)).ForNamespace("x");

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Вы, вероятно, хотите назвать / ключ вашей регистрации.См. TypedNamedAndKeyedServices - Autofac

Я думаю, это решит половину вашей проблемы, как зарегистрировать типы.Другая половина в резолюции.Поскольку вы выполняете авторегистрацию через сканирование сборок, это может занять немного больше хитрости.

2 голосов
/ 12 апреля 2011

попробуй решить проблему на более высоком уровне абстракции.Поскольку у вас есть два отдельных домена (один, содержащий сущность Activity, а другой - сущность User), было бы удобно явно указать это в своем проекте приложения.Например, определите фабрику некоторого вида для домена:

public interface IActivityDomainContextFactory
{
    ObjectContext CreateNew();
}

public interface IPeopleDomainContextFactory
{
    ObjectContext CreateNew();
}

Теперь вы можете легко создать реализацию для каждого интерфейса, зарегистрировать их в Autofac ContainerBuilder и позволить вашим сервисам зависеть от одного из этих интерфейсов.вместо зависимости от EntityConnection.

В этом случае у вас, конечно, все еще есть зависимость от самой Entity Framework (см. здесь , как абстрагировать это), ноэто делает вашу конфигурацию намного проще, менее хрупкой, более эффективной, а код вашего приложения более легким в обслуживании.

Надеюсь, это поможет.

1 голос
/ 13 апреля 2011

Есть много хороших предложений по улучшению этого, так что просто запишите мое решение как общий набросок того, как вы это сделаете в Autofac.

Хитрость заключается в использовании именованных сервисов для соединенийзатем настройте разрешение параметров для типов в каждой сборке, чтобы параметры EntityConnection получили именованный экземпляр:

builder.Register(reg => new EntityConnection(ConnectionString))
    .Named<EntityConnection>("activities");
builder.RegisterAssemblyTypes(typeof(Activity).Assembly)
    .AsImplementedInterfaces()
    .WithParameter(
        (pi, c) => pi.ParameterType == typeof(EntityConnection),
        (pi, c) => c.ResolveNamed<EntityConnection>("activities"));

builder.Register(reg => new EntityConnection(ConnectionString))
    .Named<EntityConnection>("users");
builder.RegisterAssemblyTypes(typeof(User).Assembly)
    .AsImplementedInterfaces()
    .WithParameter(
        (pi, c) => pi.ParameterType == typeof(EntityConnection),
        (pi, c) => c.ResolveNamed<EntityConnection>("users"));
...