Обмен данными через несколько контроллеров. ASP.NET MVC - PullRequest
1 голос
/ 14 марта 2012

Если у меня два контроллера:

public class PrimaryController : Controller
{
    private IRepository<Primaries> repository;

    public PrimaryController(IRepository<Primaries> repository)
    {
        this.repository = repository;
    }

    // CRUD operations
}

и

public class AuxiliaryController : Controller
{
    private IRepository<Primaries> repository;

    public AuxiliaryController(IRepository<Primaries> repository)
    {
        this.repository = repository;
    }

    // CRUD operations
    public ActionResult CreateSomethingAuxiliary(Guid id, AuxiliaryThing auxiliary)
    {
        var a = repository.Get(id);
        a.Auxiliaries.Add(auxiliary);
        repository.Save(a);

        return RedirectToAction("Details", "Primary", new { id = id });
    }
}

и DI реализован как (код из Ninject модуля)

this.Bind<ISessionFactory>()
    .ToMethod(c => new Configuration().Configure().BuildSessionFactory())
    .InSingletonScope();

this.Bind<ISession>()
    .ToMethod(ctx => ctx.Kernel.TryGet<ISessionFactory>().OpenSession())
    .InRequestScope();

this.Bind(typeof(IRepository<>)).To(typeof(Repository<>));

будет ли это работать правильно? Я имею в виду, будут ли контроллеры использовать один и тот же экземпляр репозитория?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Простой ответ - да! Код будет использовать одну и ту же реализацию для всех контроллеров, если вы явно не настроите иначе, используя When... методы.

Если вы хотите повторно использовать не реализацию, а тот же экземпляр объекта , вы можете настроить это, используя такие методы, как InScope, InRequestScope, InSingletonScope, как вы уже это делаете для ISession и ISessionFactory.

Из документации:

// Summary:
//     Indicates that instances activated via the binding should be re-used within
//     the same HTTP request.
IBindingNamedWithOrOnSyntax<T> InRequestScope();


//
// Summary:
//     Indicates that only a single instance of the binding should be created, and
//     then should be re-used for all subsequent requests.
IBindingNamedWithOrOnSyntax<T> InSingletonScope();

Использование Repository в синглтоне - плохая идея. Я использую InRequestScope, чтобы один экземпляр обслуживал только один запрос. Если вы используете Entity Framework, вы можете проверить этот ответ для деталей

1 голос
/ 14 марта 2012

Это зависит от того, как работает область действия по умолчанию в ninject (я не пользователь ninject).

Однако это сработает, если вы укажете InRequestScope в отображении хранилища.

this.Bind(typeof(IRepository<>))
    .To(typeof(Repository<>))
    .InRequestScope();

Область действия Singleton будет работать до тех пор, пока соединение с базой данных не будет закрыто.Ваше приложение прекратит работу, когда это произойдет, поскольку все запросы все равно будут пытаться использовать один и тот же объект репозитория.

Вот почему область запросов лучше.Если репозитории терпят неудачу, они будут терпеть неудачу только для одного запроса (если это не проблема с базой данных).

Я написал ряд рекомендаций: http://blog.gauffin.org/2011/09/inversion-of-control-containers-best-practices/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...