Я пытаюсь зарегистрировать общий репозиторий в единстве. Я бы предпочел сделать это в загрузчике, используя отражение.Зарегистрировать общий тип с отражениями в Unity
Я успешно реализованы и протестированы это:
container.RegisterType(typeof(MyDll.Repositories.IRepository<>), typeof(MyDll.Repositories.Repository<>), "MyDllRepository");
Тогда решения:
var result = target.Resolve(typeof(My.Repositories.IRepository<MyClass>), "MyDllRepository");
Работает отлично. Мне не нравится, что я должен явно ссылаться на MyDll в решении Bootstrapper.
Когда я пытаюсь зарегистрировать Repository автоматически с помощью отражения в моей Bootstrapper так:
private void RegisterDlls(String assembly)
{
var currentAssembly = Assembly.LoadFrom(assembly);
var assemblyTypes = currentAssembly.GetTypes();
var baseName = GetBaseName(currentAssembly.FullName);
foreach (var assemblyType in assemblyTypes)
{
if (assemblyType.IsInterface)
{
continue;
}
if (assemblyType.FullName.EndsWith("Service"))
{
foreach (var requiredInterface in assemblyType.GetInterfaces())
{
if (requiredInterface.FullName.EndsWith("Service"))
{
var typeFrom = assemblyType.GetInterface(requiredInterface.Name);
var typeTo = assemblyType;
RegisterType(typeFrom, typeTo, true, typeTo.Name);
}
}
}
if (assemblyType.Namespace.EndsWith("Repositories"))
{
foreach (var requiredInterface in assemblyType.GetInterfaces())
{
if (requiredInterface.Namespace.EndsWith("Repositories"))
{
var typeFrom = assemblyType.GetInterface(requiredInterface.Name);
var typeTo = assemblyType;
string registerName = String.Concat(baseName, "Repository");
_container.RegisterType(typeFrom, typeTo, registerName);
}
}
}
При решении я получаю исключение:
Microsoft.Practices.Unity.ResolutionFailedException был необработанное кодом пользователя Сообщение = Постановление зависимости не удалось, тип = «MyDll.Repositories.IRepository 1[MyDll.Models.MyClass]", name = "MyDllRepository". Exception occurred while: while resolving. Exception is: InvalidOperationException - The current type, MyDll.Repositories.IRepository
1 [MyDll.Models.MyClass], представляет собой интерфейс, и не может быть построена.
Любые идеи?
MyDll.Repositories.Repository класс:
public class Repository<TModel> : IRepository<TModel> where TModel : class, IModel
{
[Dependency("MyDllDataProvider")]
public IMyDllDataProvider _dataProvider { get; set; }
...
}
Спасибо. Я попробую. Сначала мне нужно будет обновить до Unity 3.x, я все еще на Unity 2.0 – user1337493