Re: Unity
От: Aen Sidhe Россия Просто блог
Дата: 02.07.09 12:03
Оценка: :)
Здравствуйте, Dog, Вы писали:

Dog>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?



var d = new Dictionary<Type, object>();
d.Add(typeof(object), new Service<object>());
С уважением, Анатолий Попов.
ICQ: 995-908
Unity
От: Dog  
Дата: 02.07.09 11:59
Оценка:
Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?
Re: Unity
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.07.09 12:09
Оценка:
Здравствуйте, Dog, Вы писали:

Dog>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?


В смысле разные реализации для разного T или нет?
Re: Unity
От: baranovda Российская Империя  
Дата: 02.07.09 12:09
Оценка:
Здравствуйте, Dog, Вы писали:

Dog>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?


RegisterType<T, TImpl>(typeof(TImpl).Name);
Re[2]: Unity
От: Dog  
Дата: 02.07.09 12:13
Оценка:
Dog>>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?
B>
B>RegisterType<T, TImpl>(typeof(TImpl).Name);
B>

А как будет выглядеть вызов ?
Re[2]: Unity
От: Dog  
Дата: 02.07.09 12:13
Оценка:
Dog>>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?
G>В смысле разные реализации для разного T или нет?
Да разные.
Re[3]: Unity
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.07.09 12:16
Оценка:
Здравствуйте, Dog, Вы писали:

Dog>>>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?

G>>В смысле разные реализации для разного T или нет?
Dog>Да разные.

Ну так и писать:

var container = new UnityContainer();
container
    .RegisterType<IService<T1>, Impl1>()
    .RegisterType<IService<T2>, Impl2>()
    .RegisterType<IService<T3>, Impl3>()
    .RegisterType(typeof(IService<>), typeof(GenericImpl<>))
    ;
Re[4]: Unity
От: Dog  
Дата: 02.07.09 12:30
Оценка:
G>
G>var container = new UnityContainer();
G>container
G>    .RegisterType<IService<T1>, Impl1>()
G>    .RegisterType<IService<T2>, Impl2>()
G>    .RegisterType<IService<T3>, Impl3>()
G>    .RegisterType(typeof(IService<>), typeof(GenericImpl<>))
G>    ;
G>

У меня есть
 interface IService<T> where T : Base
 {
    Base Get(Base @base);
 }
 class A : Base
 class B : Base
 class ServiceA : IService<A>
 class ServiceA : IService<B>

 class Foo
 {
     Base Get(Base base)
     {
      //в зависимости от типа Base вызывается IService
      ...
     }
 }
Re[5]: Unity
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.07.09 12:42
Оценка:
Здравствуйте, Dog, Вы писали:

G>>
G>>var container = new UnityContainer();
G>>container
G>>    .RegisterType<IService<T1>, Impl1>()
G>>    .RegisterType<IService<T2>, Impl2>()
G>>    .RegisterType<IService<T3>, Impl3>()
G>>    .RegisterType(typeof(IService<>), typeof(GenericImpl<>))
G>>    ;
G>>

Dog>У меня есть
Dog>
Dog> interface IService<T> where T : Base
Dog> {
Dog>    Base Get(Base @base);
Dog> }
Dog> class A : Base
Dog> class B : Base
Dog> class ServiceA : IService<A>
Dog> class ServiceA : IService<B>

Dog> class Foo
Dog> {
Dog>     Base Get(Base base)
Dog>     {
Dog>      //в зависимости от типа Base вызывается IService
Dog>      ...
Dog>     }
Dog> }
Dog>


container.Resolve(typeof(IService<>).MakeGenericType(typeof(base)));
Только вам это ничего не даст, так как не получится привести результат к типу IService<Base> так как в третьем шарпе нету ковариантности интерфейсов.
Re[6]: Unity
От: Dog  
Дата: 02.07.09 13:06
Оценка:
Dog>>У меня есть
Dog>>
Dog>> interface IService<T> where T : Base
Dog>> {
Dog>>    Base Get(Base @base);
Dog>> }
Dog>> class A : Base
Dog>> class B : Base
Dog>> class ServiceA : IService<A>
Dog>> class ServiceA : IService<B>

Dog>> class Foo
Dog>> {
Dog>>     Base Get(Base base)
Dog>>     {
Dog>>      //в зависимости от типа Base вызывается IService
Dog>>      ...
Dog>>     }
Dog>> }
Dog>>


G>container.Resolve(typeof(IService<>).MakeGenericType(typeof(base)));

G>Только вам это ничего не даст, так как не получится привести результат к типу IService<Base> так как в третьем шарпе нету ковариантности интерфейсов.
Тогда добавим это
interface IServiceBase : IService<Base>
abstract class ServiceBase<T> : IServiceBase, IService<T> where T : Base
{
  Base IService<Base>.Get(Base @base)
  {
    return Get((T)@base);
  }
  public abstract T Get(T @base);
}
class ServiceA : ServiceBase<A>
class ServiceA : ServiceBase<B>

Или можно ещё как-то...
Re[7]: Unity
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.07.09 13:35
Оценка:
Здравствуйте, Dog, Вы писали:

Dog>Или можно ещё как-то...

Ага, сделать Get обощенным.
Re[8]: Unity
От: Dog  
Дата: 02.07.09 14:18
Оценка:
Dog>>Или можно ещё как-то...
G>Ага, сделать Get обощенным.
Теперь добрались до времени жизни
У меня получилось
interface IServiceA : IService<A>
{
  void Bar();
}
class ServiceA : ServiceBase<A>, IServiceA

class Foo
{
  [Dependency]
  public IServiceA ServiceA { get; set; }
  [Dependency]
  public IServiceB ServiceB { get; set; }
  
  private UnityContainer container;

  public Foo()
  {
    container = new UnityContainer();
    container.RegisterType<IServiceBase, ServiceA>(typeof(A).Name)
    .RegisterType<IServiceBase, ServiceB>(typeof(B).Name)
    .RegisterType<IServiceA, ServiceA>()
    .RegisterType<IServiceB, ServiceB>()
    .BuildUp(this);
    // нужен один инстанс для ServiceA и ServiceB
  }
  Base Get(Base @base)
  {
     return container.Resolve<IServiceBase>(@base.GetType().Name).Get(@base);
  }
  void Bar()
  {
     ServiceA.Bar();
  }
 }

Я так понимаю что при вызове Get и Bar каждый раз будет возвращатсья новый инстанс ServiceA ?
Re[9]: Unity
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.07.09 14:56
Оценка:
Здравствуйте, Dog, Вы писали:

Dog>>>Или можно ещё как-то...

G>>Ага, сделать Get обощенным.
Dog>Теперь добрались до времени жизни
Dog>У меня получилось
Dog>
Dog>interface IServiceA : IService<A>
Dog>{
Dog>  void Bar();
Dog>}
Dog>class ServiceA : ServiceBase<A>, IServiceA

Dog>class Foo
Dog>{
Dog>  [Dependency]
Dog>  public IServiceA ServiceA { get; set; }
Dog>  [Dependency]
Dog>  public IServiceB ServiceB { get; set; }
  
Dog>  private UnityContainer container;

Dog>  public Foo()
Dog>  {
Dog>    container = new UnityContainer();
Dog>    container.RegisterType<IServiceBase, ServiceA>(typeof(A).Name)
Dog>    .RegisterType<IServiceBase, ServiceB>(typeof(B).Name)
Dog>    .RegisterType<IServiceA, ServiceA>()
Dog>    .RegisterType<IServiceB, ServiceB>()
Dog>    .BuildUp(this);
Dog>    // нужен один инстанс для ServiceA и ServiceB
Dog>  }
Dog>  Base Get(Base @base)
Dog>  {
Dog>     return container.Resolve<IServiceBase>(@base.GetType().Name).Get(@base);
Dog>  }
Dog>  void Bar()
Dog>  {
Dog>     ServiceA.Bar();
Dog>  }
Dog> }
Dog>

Dog>Я так понимаю что при вызове Get и Bar каждый раз будет возвращатсья новый инстанс ServiceA ?
А зачем вам тут контейнер? Dictiorany<Type,IServiceBase> не подойдет?

Вообще какая задача решается? А то кажется что вы выбрали не те средства.
Re[10]: Unity
От: Dog  
Дата: 02.07.09 15:09
Оценка:
G>А зачем вам тут контейнер? Dictiorany<Type,IServiceBase> не подойдет?
Сейчас уже подойдёт

G>Вообще какая задача решается? А то кажется что вы выбрали не те средства.

Прикручиваю Unity на сервере и по ходу разбираюсь с ними.
Я знаю что можно проще, но хочется побольше пощупать руками что и как работает. Так что некоторые вопросы скорее теоритические
Скачал сорцы. Оказыватеся там много интересных юниттестов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.