Ich habe ein paar Repository-Klassen in einem Repository-Projekt, das eine Entity Framework DbContext Typed Basisklasse verwendet.Castle Windsor nicht erstellen/verfügbar machen Basisklasse
Base Class
public class RepositoryBase<TC> : IDisposable
where TC : DbContext, new()
{
public virtual T Get<T>(...) where T : class
{
...
}
// ... additional code
}
Mitarbeiter Repo-Schnittstelle
namespace Insight.Repository.Interfaces
{
public interface IEmployeeRepository
{
Result CreateEmployee(Employee employee);
// ... additional code
}
}
Mitarbeiter Repo
namespace Insight.Repository.Repositories
{
public class EmployeeRepository : RepositoryBase<InsightContext>, IEmployeeRepository
{
public Result CreateEmployee(Employee employee)
{
return Save(employee);
}
}
// ... additional code
}
Ich füge die Repo-Klassen an den Windsor Container innerhalb einer ASP.MVC Website ein mit Installer basierend auf Interfaces innerhalb des Repository-Projekts. Ich habe den Container an dieser Stelle angeschaut und erhalte meine drei Repositories.
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromAssemblyNamed("Insight.Repository")
.Where(Component.IsInNamespace("Insight.Repository.Repositories"))
.WithService.DefaultInterfaces()
.LifestyleTransient());
}
Ich habe versucht, den DbContext wie folgt registrieren, aber ich bekomme die gleichen Ergebnisse.
container.Register(Component.For<DbContext>()
.ImplementedBy<InsightContext>()
.LifestyleTransient());
Dann in meinem ApiController verwende ich dann Property Injektion die Repo-Klasse zu instanziiert, aber ich kann keine der Basisklasse Funktionen Zugriff.
public class EmployeeController : ApiController
{
public IEmployeeRepository EmployeeRepo { get; set; }
[Route("GetEmployee")]
public void Get()
{
var newEmployeeRepo = new EmployeeRepository();
}
}
EmployeeRepo hat keinen Zugriff auf die Get() Funktion in der Basisklasse, aber newEmployeeRepo tut.
Dies ist mein erstes Projekt mit Castle.Windsor und ich vermisse eindeutig eine Art Registrierungsschritt, kann es aber herausfinden.
Wenn mir jemand in die richtige Richtung zeigen kann, sehr geschätzt.
Edit:
cls.GetLastName().Dump();
Ist dies das Verhalten erwartet: mit dem Code von tym32167
void Main()
{
var container = new WindsorContainer();
var type = typeof(II);
container.Register(Classes.FromAssembly(type.Assembly)
.Where(Component.IsInNamespace(type.Namespace))
.WithService.AllInterfaces()
.LifestyleTransient());
var cls = container.Resolve<II>().Dump();
cls.GetFirstName().Dump();
cls.GetLastName().Dump();
}
public interface II
{
string GetFirstName();
}
public class MyClass : II
{
public string GetFirstName()
{
return "First Name";
}
public string GetLastName()
{
return "Last Name";
}
}
Der Code bricht auf dieser Linie geliefert LINQPad Testen?
Nun, wenn Sie es so sagen, es klingt so offensichtlich. Danke, diese Lösung hat einen Reiz hervorgerufen. – Vazmo