Ich habe die Klassen unter:Unity Lösung nicht Repository
SuppliersRepository.cs (mit der Schnittstelle des Verfahrens definiert wurden):
public class SuppliersRepository : BaseRepository,ISuppliersRepository
{
public IEnumerable<Supplier> GetSuppliersByCoordinates(double latitude, double longitude)
{
using (IDbConnection connection = OpenConnection())
{
const string query = "SELECT ID=SupplierID,Name=Suppliername FROM suppliers WHERE dbo.Distance(@latitude,@longitude,latitude,longitude) < 15 AND latitude IS NOT NULL AND longitude IS NOT NULL";
return connection.Query<Supplier>(query, new { latitude = latitude,longitude=longitude });
}
}
}
BaseRepository.cs (mit der Schnittstelle des Verfahrens definieren,
)public abstract class BaseRepository: IBaseRepository
{
public IDbConnection OpenConnection()
{
IDbConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["myconnection"].ConnectionString);
connection.Open();
return connection;
}
}
A Bootstraper.cs von global.asax.cs callte mit:
public static class Bootstrapper
{
public static void Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IBaseRepository, BaseRepository>();
container.RegisterType<ISuppliersRepository, SuppliersRepository>();
container.RegisterInstance<IHttpControllerActivator>(new HttpControllerActivator(container));
container.RegisterControllers();
return container;
}
}
Und zwei Controller löst erste das Repository fein:
public class VenueController : MasterController
{
[Dependency]
public SuppliersRepository _SuppliersRepository { get; set; }
}
Aber dieser ausfällt:
public class AjaxController : Controller
{
[Dependency]
public BaseRepository _BaseRepository { get; set; }
}
Es wirft eine System.InvalidOperationException: Der Typ BaseRepository kann nicht erstellt werden. Sie müssen den Container konfigurieren, um diesen Wert zu liefern.
Irgendeine Idee was mache ich falsch?
Es ist besser, die Konstruktorinjektion anstelle der Eigenschaftsinjektion zu verwenden. Auf diese Weise müssen Sie Ihre Eigenschaften nicht mit dem Attribut "[Dependency]" dekorieren und verhindern, dass Ihr Anwendungscode eine Abhängigkeit von Unity erhält. – Steven