Подтвердить что ты не робот

Как передать аргументы конструктора при регистрации типа в Unity?

В Unity зарегистрирован следующий тип:

container.RegisterType<IAzureTable<Account>, AzureTable<Account>>();

Определение и конструкторы для AzureTable заключаются в следующем:

public class AzureTable<T> : AzureTableBase<T>, IInitializer where T : TableServiceEntity
{

    public AzureTable() : this(CloudConfiguration.GetStorageAccount()) { }
    public AzureTable(CloudStorageAccount account) : this(account, null) { }
    public AzureTable(CloudStorageAccount account, string tableName)
            : base(account, tableName) { }

Можно ли указать аргументы конструктора в строке RegisterType? Например, я должен иметь возможность передавать имя таблицы.

Это продолжение моего последнего вопроса. Этот вопрос был, я думаю, ответил, но я действительно не спрашивал, как получить аргументы конструктора.

4b9b3361

Ответ 1

Ниже приведена страница MSDN, описывающая то, что вам нужно, Значения ввода. Взгляните на использование класса InjectionConstructor в строке типа регистра. В итоге вы получите следующую строку:

container.RegisterType<IAzureTable<Account>, AzureTable<Account>>(new InjectionConstructor(typeof(CloudStorageAccount)));

Параметры конструктора до InjectionConstructor - это значения, которые нужно передать в ваш AzureTable<Account>. Любые параметры typeof оставляют единство для разрешения используемого значения. В противном случае вы можете просто выполнить свою реализацию:

CloudStorageAccount account = new CloudStorageAccount();
container.RegisterType<IAzureTable<Account>, AzureTable<Account>>(new InjectionConstructor(account));

Или именованный параметр:

container.RegisterType<CloudStorageAccount>("MyAccount");
container.RegisterType<IAzureTable<Account>, AzureTable<Account>>(new InjectionConstructor(new ResolvedParameter<CloudStorageAccount>("MyAccount")));

Ответ 2

Вы можете попробовать:

// Register your type:
container.RegisterType<typeof(IAzureTable<Account>), typeof(AzureTable<Account>)>()

// Then you can configure the constructor injection (also works for properties):
container.Configure<InjectedMembers>()
  .ConfigureInjectionFor<typeof(AzureTable<Account>>(
    new InjectionConstructor(myConstructorParam1, "my constructor parameter 2") // etc.
  );

Дополнительная информация с MSDN здесь.