2009-11-25 2 views
8

Je suis très nouveau à Ninject et j'essaye Ninject 2 avec MVC et Linq. J'ai une classe SqlProductRepository et tout ce que je veux savoir, c'est quelle est la meilleure façon de passer la chaîne de connexion dans le constructeur si j'injecte l'objet Repository dans le contrôleur.Ninject et les chaînes de connexion

public class SqlProductRepository:IProductRepository 
{ 
    private Table<Product> productsTable; 

    public SqlProductRepository(string connectionString) 
    { 
     productsTable = (new DataContext(connectionString)).GetTable<Product>(); 
    } 

    public IQueryable<Product> Products 
    { 
     get { return productsTable; } 
    } 
} 

Ceci est ma classe ProductController où je suis injectais le dépôt:

public class ProductsController : Controller 
{ 
    private int pageSize = 4; 
    public int PageSize { get { return pageSize; } set { pageSize = value; } } 

    IProductRepository _productsRepository; 

    [Inject] 
    public ProductsController(IProductRepository productRepository) 
    { 
     _productsRepository = productRepository; 
    } 

    public ViewResult List(int page) 
    { 
     return View(_productsRepository.Products 
             .Skip((page - 1) * pageSize) 
             .Take(pageSize) 
             .ToList() 
        ); 
    } 
} 

quelqu'un peut s'il vous plaît me guider ce sujet?

Répondre

15

Vous pouvez le configurer dans votre fixation

 

_kernel.Bind<IProductRepository>() 
     .To<SqlProductRepository>() 
     .WithConstructorArgument("connectionString",yourConnectionString); 
5

que vous faites:

new DataContext(connectionString) 

dans votre code - c'est le très newing et obligatoire aux classes que vous essayez de pousser hors de votre code en utilisant un conteneur DI. À tout le moins, pensez à ajouter une interface IConnectionStringSelector ou quelque chose comme ça. Vous ne voulez pas avoir 20 appels Bind pour 20 dépôts - vous voulez une abstraction de plus haut niveau que cela.

Je suggérerais que la meilleure solution est que vous demandiez un IDataContext ou un IDataContextFactory dans le constructeur et que vous vous en souciez.

2

Vous pouvez fournir la chaîne de connexion en tant qu'argument de constructeur lors de la liaison du SqlProductRepository à l'interface IProductRepository.

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

Je suggérerais une approche légèrement différente. Tout d'abord, vous pouvez créer une liaison pour la classe DataContext dans le noyau. Vous pouvez le faire en utilisant une classe fournisseur pour créer votre DataContext en transmettant la chaîne de connexion en tant qu'argument à son constructeur. Ensuite, vous liez le DataContext au 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>(); 
    } 
} 

Suivant modifier le constructeur de la classe SqlProductRepository d'accepter un objet au lieu 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>(); } 
    } 
} 

par la façon dont vous ne disposez pas de décorer votre constructeur avec l'attribut Inject. Ninject sélectionnera le constructeur avec le plus de paramètres par défaut.

0

S'il vous plaît se référer ci-dessous snap code:

//Bind the default connection string 
    public void BindDataContext() 
    { 
     ConstructorArgument parameter = new ConstructorArgument("connectionString", "[Config Value]"); 
     Bind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter); 
    } 
    //Re-Bind the connection string (in case of multi-tenant architecture) 
    public void ReBindDataContext(string cn) 
    { 
     ConstructorArgument parameter = new ConstructorArgument("connectionString", cn); 
     Rebind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter); 
    } 

Pour plus d'informations, s'il vous plaît visitez lien ci-dessous

MVC3, Ninject and Ninject.MVC3 problem

Questions connexes