如何使用Ninject與樣本代碼接口及其實現這樣的:如何在Ninject中使用非默認的構造函數?
public interface IRepository
{
// common methods for all content types
void Insert(BaseContentObject o);
void Update(BaseContentObject o);
void Delete(string slug);
void Delete(ContentType contentType, string slug);
IEnumerable<BaseContentObject> GetInstances();
BaseContentObject GetInstance(ContentType contentType, string slug);
BaseContentObject GetInstance(string contentType, string slug);
BaseContentObject GetInstance(string slug);
IEnumerable<string> GetSlugsForContentType(int limit = 0, string query = "");
ContentList GetContentItems();
bool IsUniqueSlug(string slug);
string ObjectPersistanceFolder { get; set; }
}
public class XmlDefaultRepository : IRepository
{
private ContentType SelectedType;
public XmlDefaultRepository(string contentType)
{
SelectedType = (ContentType) Enum.Parse(typeof(ContentType), contentType);
}
public void Insert(Models.ContentClasses.BaseContentObject o)
{
throw new NotImplementedException();
}
// ...
}
public class PageController : BaseController
{
private IRepository ContentRepository { get; private set; }
public PageController(IRepository repository)
{
ContentRepository = repository;
}
//
// GET: /{slug}
// GET: /Pages/{slug}
public ActionResult Display(string slug)
{
// sample repository usage
Page page = ContentRepository.GetInstance(slug);
// ...
}
}
我的代碼不包含默認構造函數,因爲我並不需要一個(即使想創造它,我不能因爲我總是要求的內容類型來提供。
我不能讓一個默認的構造函數,因爲沒有邏輯上不提供默認的內容類型。
這是Ninject產生試圖加載我的ASP當異常.NET MVC頁面。
*Error activating string
No matching bindings are available, and the type is not self-bindable.
Activation path:
- Injection of dependency string into parameter contentType of constructor of type XmlDefaultRepository
- Injection of dependency IRepository into parameter repository of constructor of type PageController
- Request for IController
Suggestions:
- Ensure that you have defined a binding for string.
- If the binding was defined in a module, ensure that the module has been loaded into the kernel.
- Ensure you have not accidentally created more than one kernel.
- If you are using automatic module loading, ensure the search path and filters are correct.*
我已經更新了我的代碼是肯定。並提供Ninject的例外 – mare 2010-07-06 12:56:08
如果我繼續上面的代碼,並在我的Ninject模塊中執行此操作 綁定().To ()。WithConstructorArgument(「contentType」,「Page」); 然後它工作,但是事情是,我無法將我的contentType構造函數參數綁定到我的Module中的「Page」中,這個構造函數參數與控制器有關,所以在我的PageController中,XmlDefaultRepository會使用contentType的「Page」值實例化,但在其他控制器(如ServiceController)中,「contentType」參數值應等於「Service」。 –
mare
2010-07-06 14:25:52
希望你明白我不能硬編碼模塊中「contentType」參數的值。我怎麼解決這個問題?控制器工廠等等是什麼? – mare 2010-07-06 14:27:18