2009-11-25 14 views
8

मैं निनजेक्ट के लिए बहुत नया हूं और एमवीसी और लिंक के साथ निनजे 2 की कोशिश कर रहा हूं। मेरे पास एक SqlProductRepository क्लास है और मैं यह जानना चाहता हूं कि कन्स्ट्रक्टर में कनेक्शनस्ट्रिंग पास करने का सबसे अच्छा तरीका क्या है यदि मैं नियंत्रक में रिपोजिटरी ऑब्जेक्ट इंजेक्शन कर रहा हूं।निनजा और कनेक्शन स्ट्रिंग्स

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

किसी कृपया मुझे इस बारे में मार्गदर्शन कर सकते हैं?

उत्तर

15

आप अपने बंधन

 

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

में उसे सेट कर सकते आप कर रहे हैं:

new DataContext(connectionString) 
अपने कोड में

- यह बहुत ही Newing है और कक्षाओं आप पुश करने के लिए कोशिश कर रहे हैं के लिए बाध्य एक डी कंटेनर का उपयोग करके अपने कोड से बाहर। कम से कम, IConnectionStringSelector इंटरफ़ेस या ऐसा कुछ जोड़ने पर विचार करें। आप 20 Bind 20 रिपॉजिटरीज़ के लिए कॉल नहीं करना चाहते हैं - आप उससे उच्च स्तर की अमूर्तता चाहते हैं।

मुझे सुझाव है कि सबसे अच्छा समाधान यह है कि आपको या तो IDataContext या IDataContextFactory को इसके बजाय निर्माता में मांगना चाहिए और इसके बारे में चिंता करना चाहिए।

2

IProductRepository इंटरफ़ेस पर SqlProductRepository को बाध्य करते समय आप एक कन्स्ट्रक्टर तर्क के रूप में कनेक्शन स्ट्रिंग की आपूर्ति कर सकते हैं।

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

अगला बजाय एक DataContext वस्तु को स्वीकार करने के SqlProductRepository वर्ग के निर्माता को संशोधित।

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 विशेषता के साथ अपने निर्माता को सजाने के लिए की जरूरत नहीं है के द्वारा। 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

नीचे जाएँ
संबंधित मुद्दे