Я использую внедрение зависимостей для своего бизнес-уровня, который содержит службы, такие как мой пример ниже:
public class MyService : IMyService
{
private IMyDbContext DbContext;
public MyService(IMyDbContext dbContext)
{
this.DbContext = dbContext;
}
public DoSomething(int id)
{
// Use the business layer for something
var user = this.DbContext.Set<User>().Find(id);
}
}
Как видите, мой сервис имеет зависимость от Entity Framework DbContext. Я использую Ninject в качестве своего контейнера IoC, но я думаю, что это может относиться к любому.
Конфигурация веб-сайта ASP.NET MVC
Для моего веб-сайта ASP.NET я настроил это с помощью Ninject для создания одного IMyDbContext
для каждого запроса, и для каждого запроса требуется только один экземпляр IMyService
, так что это красиво и просто.
- IMyService — временный
- IMyDbContext — по запросу
Конфигурация службы Windows
Я хочу настроить его так, чтобы для каждой итерации моей службы Window мне не приходилось «обновлять» мою службу для каждой итерации.
Я хочу иметь следующую конфигурацию:
- IMyService — единственный экземпляр или временный
- IMyDbContext — новый экземпляр каждый раз, когда вызывается метод
Эта проблема
Как это может быть достигнуто, когда я делюсь своими услугами между двумя разными проектами.
Мой друг предложил использовать Factory для моего IDbContext
, что было бы неплохо, если бы я не хотел продолжать использовать Per Request Scope
в своем приложении ASP.NET, но я хочу. Я не уверен, что смогу настроить фабрику так, чтобы каждый раз возвращать один и тот же экземпляр только для этой цели и новый экземпляр для каждого запроса в моей службе Windows.
Проблема в том, что, например, если я сейчас использую фабрику (для службы Windows, для которой требуется новый экземпляр для каждого вызова DoSomething()
):
public class MyService : IMyService
{
private IMyContextFactory DbContextFactory;
public MyService(IMyContextFactory dbContextFactory)
{
this.DbContextFactory = dbContextFactory;
}
public DoSomething(int id)
{
// Get instance of the db for use
var dbContext = this.DbContextFactory.GetInstance();
// Use the business layer for something
var user = dbContext.Set<User>().Find(id);
}
}
Как видите, мне пришлось добавить строку кода, чтобы использовать фабрику.
Это больше не работает для моего веб-сайта, который хочет использовать один (для каждого запроса) экземпляр DbContext.
Мне нужна конфигурация, которая будет работать для обоих сценариев, так как я делюсь кодовой базой.
У меня уже есть бустраппер для обоих проектов, который настраивает привязки kernel
, это просто как я настраиваю свои привязки для разных сценариев при совместном использовании базы кода.
var dbContext = DbContextFactory.GetInstance()
теперь у него есть код, который ссылается на фабрику, поэтому я больше не использую свой синглтон для своего веб-приложения. - person Luke   schedule 02.06.2015