Как передать аргументы конструктора при регистрации типа в 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? Например, я должен иметь возможность передавать имя таблицы.
Это продолжение моего последнего вопроса. Этот вопрос был, я думаю, ответил, но я действительно не спрашивал, как получить аргументы конструктора.
Ответы
Ответ 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 здесь.