Ninject и строки подключения

3 ответа

Вы делаете:

new DataContext(connectionString)

в вашем коде - это самое нововведение и привязка к классам, которые вы пытаетесь вытолкнуть из своего кода с помощью контейнера DI. По крайней мере, подумайте о добавлении интерфейса IConnectionStringSelector или чего-то подобного. Вы не хотите иметь 20 вызовов Bind для 20 репозиториев - вам нужна абстракция более высокого уровня, чем эта.

Я бы посоветовал лучшее решение - требовать либо IDataContext или IDataContextFactory в конструкторе вместо этого, позволяя этому беспокоиться об этом.

5
ответ дан 5 December 2019 в 07:35
поделиться

Вы можете указать строку подключения в качестве аргумента конструктора при привязке SqlProductRepository к интерфейсу IProductRepository .

public class LinqToSqlModule : NinjectModule
{
    public override void Load()
    {
        Bind<IProductRepository>().To<SqlProductRepository>()
            .WithConstructorArgument(connectionString, "connectionstring");
    }
}

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

public class DataContextProvider : Provider<DataContext>
{
    protected override DataContext CreateInstance(IContext context)
    {
        string connectionString = "connectionstring";
        return new DataContext(connectionString);
    }
}

public class LinqToSqlModule : NinjectModule
{
    public override void Load()
    {
        Bind<DataContext>().ToProvider<DataContextProvider>();
        Bind<IProductRepository>().To<SqlProductRepository>();
    }
}

Затем модифицируйте конструктор класса SqlProductRepository , чтобы вместо этого он принял объект DataContext .

public class SqlProductRepository : IProductRepository
{
    private readonly DataContext context;

    public ProductRepository(DataContext context)
    {
        this.context = context;
    }

    public IQueryable<Product> Products
    { 
        get { return context.GetTable<Product>(); }
    }
}

Кстати, вам не нужно украшать свой конструктор атрибутом Inject .

2
ответ дан 5 December 2019 в 07:35
поделиться

Вы можете настроить его в своей привязке


_kernel.Bind<IProductRepository>()
       .To<SqlProductRepository>()
       .WithConstructorArgument("connectionString",yourConnectionString );
15
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: