Как я могу передать аргументы конструктора, когда я регистрирую тип в Unity? - PullRequest
13 голосов
/ 23 декабря 2011

У меня есть следующий тип, зарегистрированный в 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линия?Мне нужно быть в состоянии передать в tableName, например.

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

Ответы [ 2 ]

30 голосов
/ 23 декабря 2011

Вот страница 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")));
4 голосов
/ 23 декабря 2011

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

// 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 здесь .

...