Какой лучший способ добавить контекст в мой базовый репозиторий? - PullRequest
0 голосов
/ 17 октября 2011

У меня есть BaseRepository , который зависит от DbContext для выполнения операций с базой данных:

public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : Entity
{
   ...
}

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

Мой DbContext наследуется от IDbContext интерфейса, где находится мой Шаблон UnitOfWork :

public class DbContext : System.Data.Entity.DbContext, IDbContext
{
   ...
}

И я установил IDbContext, используя Ninject :

public override void Load()
{
   Bind<IDbContext>().To<DbContext>().InRequestScope();
}

У меня вопрос, как я внедряю DbContext в базовый репозиторий, и мне нужен один экземпляр DbContext в requestScope. (Использование фабрики?)

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Как правило, поскольку вашему репозиторию требуется a DBContext, вы должны использовать внедрение конструктора - контекст не является обязательным.

Если ваши экземпляры репозитория создаются с использованием Ninject, не имеет значения, что вам нужно передать DBContext - зависимость будет разрешена для вас.

Если вы хотите «вручную» создавать экземпляры репозитория, вы можете использовать фабрику, которая уже имеет зависимость DBContext, поэтому потребители не должны беспокоиться об этом.

0 голосов
/ 19 октября 2011

Я нашел решение, используя сервисный локатор Ninject, и забрал экземпляр DbContext:

public class ExampleClass()
{
    protected DbContext DbContext
    {
        get
        {
                                                                        //Here I do the trick I wanted
            return DependencyResolverFactory.Instance.Get<IDbContext>() as DbContext;
        }
    }

    ...
}

И мой класс Resoldency Resolver:

public static class DependencyResolver
{
    private static IKernel _kernel;

    static DependencyResolver()
    {
        _kernel = new StandardKernel();
        _kernel.Load(Assembly.GetExecutingAssembly());
    }

    public static IKernel GetCurrentKernel()
    {
        return _kernel;
    }

    public static void RegisterKernel(IKernel kernel)
    {
        _kernel = kernel;
    }

    public static T Get<T>()
    {
        return _kernel.Get<T>();
    }
}
...