Для любого объекта, срок жизни которого должен явно управляться (например, объекты, которые реализуют IDisposable
) или имеет значение для пользователя, старайтесь не внедрять их, а внедряйте фабрику, которая вместо этого позволяет создавать такие объекты. Определите этот интерфейс, например:
public interface IDbDataContextFactory
{
dbDataContext CreateNew();
}
И используйте его следующим образом:
public class SqlPupilBlockService
{
private IDbDataContextFactory contextFactory;
public SqlPupilBlockService(
IDbDataContextFactory contextFactory)
{
this.contextFactory = contextFactory;
}
public void DoSomeOperation()
{
using (var db = this.contextFactory.CreateNew())
{
// use the dbDataContext here.
}
}
}
Реализация была бы очень простой, как это:
public class DbDataContextFactory : IDbDataContextFactory
{
public dbDataContext CreateNew()
{
return new dbDataContext();
}
}
И регистрация идет так:
Bind<IDbDataContextFactory>().To<DbDataContextFactory>();
Использование фабрики очень четко указывает, кто является владельцем созданного объекта, а кто должен контролировать его время жизни. Это делает ваш код более читабельным и следует принципу наименьшего удивления .
UPDATE
Прошло более года с тех пор, как я отправил этот ответ. Вместо того чтобы использовать фабрики, я теперь часто внедряю сам контекст данных и регистрирую его для каждого (веб) запроса. Тем не мение; Как всегда, может потребоваться изменение в том, как вам нужно разрабатывать ваше приложение: это зависит. Пожалуйста, посмотрите на этот ответ .