Здравствуйте, Dog, Вы писали:
Dog>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?
var d = new Dictionary<Type, object>();
d.Add(typeof(object), new Service<object>());
Здравствуйте, Dog, Вы писали:
Dog>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?
Здравствуйте, Dog, Вы писали:
Dog>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ?
Dog>>Нарпимер есть куча реализаций IService<T>. Как проще зарегистрировать их все в контейнере, а потом получать конкретную реализацию по типу T ? G>В смысле разные реализации для разного T или нет?
Да разные.
Здравствуйте, 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<>))
;
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
...
}
}
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> так как в третьем шарпе нету ковариантности интерфейсов.
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>
Здравствуйте, Dog, Вы писали:
Dog>>>Или можно ещё как-то... G>>Ага, сделать Get обощенным. Dog>Теперь добрались до времени жизни Dog>У меня получилось Dog>
Dog>Я так понимаю что при вызове Get и Bar каждый раз будет возвращатсья новый инстанс ServiceA ?
А зачем вам тут контейнер? Dictiorany<Type,IServiceBase> не подойдет?
Вообще какая задача решается? А то кажется что вы выбрали не те средства.
G>А зачем вам тут контейнер? Dictiorany<Type,IServiceBase> не подойдет?
Сейчас уже подойдёт
G>Вообще какая задача решается? А то кажется что вы выбрали не те средства.
Прикручиваю Unity на сервере и по ходу разбираюсь с ними.
Я знаю что можно проще, но хочется побольше пощупать руками что и как работает. Так что некоторые вопросы скорее теоритические
Скачал сорцы. Оказыватеся там много интересных юниттестов.