2009-11-25 3 views
8

저는 Ninject에 매우 익숙하며 MVC 및 Linq와 함께 Ninject 2를 시도하고 있습니다. 나는 SqlProductRepository 클래스를 가지고 있는데 컨트롤러에 리포지토리 객체를 주입 할 때 생성자에서 connectionstring을 전달하는 가장 좋은 방법은 무엇인지 알고 싶습니다.Ninject 및 연결 문자열

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

이 내가 저장소 주입하고 내 ProductController 클래스입니다 :

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

누군가가 이에 대해 나를 인도 주실 수 있습니까? 이것은 매우 newing이며 밀어하려는 클래스에 바인딩 -

코드에서
new DataContext(connectionString) 

가 :

답변

15

당신은 당신이하고있는 당신의

 

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

바인딩에서 설정할 수 있습니다 DI 컨테이너를 사용하여 코드에서 최소한 IConnectionStringSelector 인터페이스 또는 이와 유사한 것을 추가하는 것을 고려하십시오. 20 개의 리포지토리에 대해 Bind 콜을 사용하고 싶지는 않습니다. 이보다 높은 수준의 추상화가 필요합니다.

가장 좋은 해결책은 생성자에 IDataContext 또는 IDataContextFactory을 요구하고 걱정해야한다는 것입니다.

2

SqlProductRepositoryIProductRepository 인터페이스에 바인드 할 때 연결 문자열을 생성자 인수로 제공 할 수 있습니다.

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

나는 약간 다른 접근 방식을 제안합니다. 우선, 커널에 DataContext 클래스에 대한 바인딩을 생성하고자 할 수 있습니다. 공급자 클래스를 사용하여 연결 문자열을 해당 생성자의 인수로 전달하여 DataContext을 만들면 그렇게 할 수 있습니다. 그런 다음 DataContextProviderDataContext을 바인딩합니다.

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

은 다음 대신 DataContext 객체를 받아 SqlProductRepository 클래스의 생성자를 수정합니다.

그런데 Inject 속성으로 생성자를 꾸밀 필요가 없습니다. Ninject는 기본적으로 가장 많은 매개 변수를 가진 생성자를 선택합니다.

0

코드 스냅 아래를 참조하십시오 :

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

자세한 내용은 링크

MVC3, Ninject and Ninject.MVC3 problem

아래에 방문하십시오