2009-11-25 23 views
8

Ben Ninject için çok yeni ve MVC ve Linq ile Ninject 2 çalışıyorum. SqlProductRepository sınıfım var ve tek bilmek istediğim, denetleyicideki Deponit nesnesini enjekte edersem, kurucudaki bağlantıyı iletmenin en iyi yoludur.Nesne ve Bağlantı Dizeleri

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; } 
    } 
} 

Bu benim Deposu'nun enjekte ediyorum benim ProductController sınıftır:

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() 
        ); 
    } 
} 

birileri bu ilgili bana yol misiniz? Bu çok newing olduğunu ve itmek için çalışıyoruz sınıflara bağlama -

kodunuzu
new DataContext(connectionString) 

:

cevap

15

Sen yapıyoruz senin

 

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

bağlayıcı bunu ayarlayabilirsiniz DI kabı kullanarak kodunuzun dışında. En azından, bir IConnectionStringSelector arayüzünü veya buna benzer bir şey eklemeyi düşünün. 20 depo için 20 Bind çağrısı yapmak istemezsiniz - bundan daha yüksek seviyede bir soyutlama istersiniz.

En iyi çözüm önerisi, yapıcıda IDataContext ya da IDataContextFactory talep etmeniz ve bunun için endişelenmenize izin vermenizdir.

2

SqlProductRepository'u IProductRepository arabirimine bağlarken bağlantı dizesini bir yapıcı argümanı olarak sağlayabilirsiniz.

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

Biraz farklı bir yaklaşım öneririm. Her şeyden önce, çekirdekte DataContext sınıfı için bir bağlayıcı oluşturmak isteyebilirsiniz. Bağlantı dizesini yapıcısına argüman olarak ileterek DataContext kodunuzu oluşturmak için bir sağlayıcı sınıfı kullanarak bunu yapabilirsiniz. Sonra DataContext'u DataContextProvider'a bağlarsınız.

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>(); 
    } 
} 

Sonraki yerine DataContext nesne kabul SqlProductRepository sınıfının kurucu değiştirin. Eğer Inject özniteliği ile yapıcı süslemek gerek yok arada

public class SqlProductRepository : IProductRepository 
{ 
    private readonly DataContext context; 

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

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

. Ninject, varsayılan olarak çoğu parametreli kurucuyu seçecektir.

0

kod çırpıda lütfen aşağıya bakın:

//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); 
    } 

fazla bilgi için, bağlantıya

MVC3, Ninject and Ninject.MVC3 problem

aşağıda ziyaret ediniz