5

Я пытаюсь использовать единство автоматически впрыскивать DataContext в моем хранилище, используя новый экземпляр каждый раз .., моя идея является обеспечить, чтобы каждый раз, когда новый DataContext впрыскиваетсяUNITY: каждый раз переходя в новый datacontext?

В настоящее время его неудача в создании хранилища, я думаю, что он не может разрешить MyDataContext

Перед созданием конструктора на «хранилище» (см ниже), чтобы взять в DataContext на моем хранилище все работало, но теперь его провал ..

в настоящее время я эту установку в моем контейнере единства, который я создаю в global.asax, я также зарегистрировал тип MyDataContext, который является стандартным DataContext

 container = new UnityContainer(); 

     Container.RegisterType<MyDataContext, MyDataContext>() 
      .RegisterType<IOfficeRepository, OfficeRepository>() 
      .RegisterType<IOfficeService, OfficeService>(); 

в основном у меня есть сервис, который вызывает хранилище, как так

public class OfficeService : IOfficeService 
{ 

    IOfficeRepository repository = null; 

    public OfficeService(IOfficeRepository repository) 
    { 
     this.repository = repository; 

     if (this.repository == null) 
      throw new InvalidOperationException("Repository cannot be null"); 
    } 

здесь мой репозиторий

public class OfficeRepository : IOfficeRepository 
{ 
    private MyDataContext db; 

    public OfficeRepository (MyDataContext dataContext) 
    { 
     this.db = dataContext; 
    } 

EDIT

Я почти забыл, что я делаю это для создания сервиса

officeService = Bootstrapper.Container.Resolve<IOfficeService>(); 

EDIT - ОШИБКА СРЕДСТВО СГЕНЕРИРОВАННЫМИ

Resolution of the dependency failed, type = "MarkSmith.IOfficeService", name = "". 
Exception message is: The current build operation (build key Build 
Key[MarkSmith.OfficeService, null]) failed: The parameter repository could not be 
resolved when attempting to call constructor 
MarkSmith.OfficeService(MarkSmith.IOfficeRepository repository). (Strategy type BuildPlanStrategy, index 3) 

EDIT - УДАЛЕНИЕ Конструктор на хранилище работает

Это что-то делать с DataContext, потому что если я удалить constrcutor на репозиторий, который принимает DataContext, тогда все работает, но, конечно, мне нужно, чтобы он принял DataContext, чтобы каждый раз вводить «NEW» datacontext

public class OfficeRepository : IOfficeRepository 
{ 
    private MyDataContext db new MyDataContext(); // CHANGE 

    //public OfficeRepository (MyDataContext dataContext) 
    //{ 
     //this.db = dataContext; 
    //} 

EDIT - АКТУАЛЬНО ОШИБКА

После копать глубже я нашел эту ошибку ....

The type MyDataContext has multiple constructors of length 2. 
Unable to disambiguate. (Strategy type DynamicMethodConstructorStrategy, index 0) 
(Strategy type BuildPlanStrategy, index 3) 

EDIT - TEST РАЗРЕШИТЬ DataContext с 1 строки кода

Это также не работает с той же ошибкой, что и выше, - несколько конструкторов

MyDataContext test = Bootstrapper.Container.Resolve<MyDataContext >(); 

EDIT - ВСЕ CONSTRUCTORS НА МОЕ DataContext

Они были создаваемом exernal Util, но все должно быть хорошо ..

[System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext() 
     : base(ConnectionString, mappingCache) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(string connection) 
     : base(connection, mappingCache) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(System.Data.IDbConnection connection) 
     : base(connection, mappingCache) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) 
     : base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) 
     : base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

EDIT - Для того, чтобы продемонстрировать создание DataContext в коде без единства работает 100% без проблем

MyDataContext tes2t = new MyDataContext(); 
+0

Обновленный вопрос, чтобы показать, как я разрешаю свое обслуживание, используя единство –

+0

Что произойдет, если вы попытаетесь разрешить экземпляр MyDataContext, используя в разных точках? Все, кажется, в порядке, но это может дать нам ключ. – GraemeF

+0

Кроме того, есть ли недостающая строка или опечатка в первом извлечении кода? Похоже, что 'container' и' Container' будут разными экземплярами. Вы можете проверить, что у вас есть экземпляр, который вы ожидаете, используя отладчик. – GraemeF

ответ

10

Я не уверен, что это работает, но вы пытались зарегистрировать MyDataContext в качестве компонента а не сопоставление типов?

container.RegisterType<MyDataContext>(); 

вместо

container.RegisterType<MyDataContext, MyDataContext>(); 

EDIT на основе новой информации

Преступник, кажется, что MyDataContext имеет более одного конструктора. Это обычная проблема с большинством контейнеров DI, потому что им нужно выбирать и использовать только один. Если вы можете устранить двусмысленность, ограничив MyDataContext, чтобы иметь только один конструктор, это, вероятно, будет самым простым решением.

В противном случае вы сможете использовать экземпляр InjectionConstructor для идентификации конструктора при регистрации репозитория. Давайте предположим, что вы хотите использовать конструктор, который принимает строку соединения в качестве аргумента:

string connectionString = 
    ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString; 
var injectedConnectionString = new InjectionConstructor(connectionString); 
container.RegisterType<MyDataContext>(injectedConnectionString); 
+0

Спасибо, Марк, я попробовал это и его то же самое. Я уточнил свой вопрос с конкретной ошибкой. –

+0

Обновленный вопрос также для демонстрации работы с конструкторами, но, конечно, мне нужен конструктор, чтобы принять DataContext - любые идеи? –

+0

См. Мой обновленный ответ. –

1

Я не вижу ваши MyDataContext конструкторов; но попробуйте добавить атрибут [InjectionConstructor] к тому, который вы хотите использовать.

+1

Это должно сработать, но будет тесно связывать MyDataContext с Unity. –

+0

Этот факт действительно работает !!! Но, как отметил Марк, он тесно связан, а также мой datacontext создается внешним пользователем, поэтому атрибут будет перезаписан ... Я действительно не совсем понимаю, почему у единства возникает проблема, меня не интересует какой-либо конструктор (т.е. конструкторы с 2 aprams) меня интересует только конструктор нулевого пара и, конечно, есть только 1 ... Есть ли альтернатива ??? –

3

С несколькими конструкторами на выбор, Unity не знает, какой из них использовать. Он выберет тот, который содержит большинство аргументов, которые могут быть выполнены, но в этом случае есть два конструктора с двумя разрешимыми аргументами.

Если вы не хотите, чтобы соединить ваш MyDataContext класс для единства и использовать атрибут InjectionConstructor как предложил Скотт (upvoted :)), вы можете указать конструктор, который должен быть использован во время регистрации с помощью свободно интерфейса , См. Configuring Constructor, Property, and Method Injection.

+0

Спасибо GraemeF, это отличная информация .. Спасибо за вашу помощь .. –

Смежные вопросы