powered by simpleCommunicator - 2.0.46     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Инжекция зависимостей для WCF сервиса.
6 сообщений из 6, страница 1 из 1
Инжекция зависимостей для WCF сервиса.
    #38040963
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть контракт службы:

Код: c#
1.
2.
3.
4.
5.
public interface IMyService
{
    [OperationContract]
    string MyMethod(long i);
}



и его реализация:

Код: c#
1.
2.
3.
4.
5.
6.
public class MyService : IMyService
{
    public MyService(IRepository<Entity> repository) {//....}

    public string MyMethod(long i) { return "Called MyMethod long"; }
}



Естественно при запуске хоста он ругается на то, что должен быть публичный конструктор по умолчанию.
Существует ли в WCF какая либо возможность задействовать DI-контейнер для разрешения зависимостей
и генерации экземпляров сервисов с их зависимостями?
...
Рейтинг: 0 / 0
Инжекция зависимостей для WCF сервиса.
    #38041039
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,
IInstanceProvider, IInterceptionBehavior.
Отлично разжевано здесь с примером для Unity:
Unity+WCF
...
Рейтинг: 0 / 0
Инжекция зависимостей для WCF сервиса.
    #38041163
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

рекомендую windsor . Не только инжекция зависимостей, но и облегчение конфигурации WCF.
см. WCF Integration Facility .
...
Рейтинг: 0 / 0
Инжекция зависимостей для WCF сервиса.
    #38041412
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,

Спасибо. Это я оставлю на попозже.
Сначала хотелось бы разобраться в самом механизме.

tAZAR,

Чет не взлетело у меня это.

Вот моя реализация UnityInstanceProvider:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public class UnityInstanceProvider : IInstanceProvider
    {
        private IUnityContainer Container { set; get; }

        public Type ServiceType { set; get; }

        public UnityInstanceProvider()
        {
            this.Container = new UnityContainer();
            this.Container
                .RegisterType<IMyService, MyService>()
                .RegisterType(typeof(IRepository<>), typeof(Repository<>));
        }

        #region IInstanceProvider Members

        public object GetInstance(InstanceContext instanceContext, Message message)
        {
            return Container.Resolve(ServiceType);
        }

        public object GetInstance(InstanceContext instanceContext)
        {
            return this.GetInstance(instanceContext, null);
        }

        public void ReleaseInstance(InstanceContext instanceContext, object instance) { }

        #endregion

    }



Вот моя реализация UnityServiceBehavior:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public class UnityServiceBehavior : IServiceBehavior
    {
        private UnityInstanceProvider InstanceProvider { get; set; }

        public UnityServiceBehavior()
        {
            this.InstanceProvider = new UnityInstanceProvider();
        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
            {
                ChannelDispatcher cd = cdb as ChannelDispatcher;

                if (cd != null)
                {
                    foreach (EndpointDispatcher ed in cd.Endpoints)
                    {
                        this.InstanceProvider.ServiceType = serviceDescription.ServiceType;
                        ed.DispatchRuntime.InstanceProvider = this.InstanceProvider;
                    }
                }
            }
        }

        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        { }

        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        { }
    }



Код создания хоста и реализации службы:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
class Program
    {
        static void Main(string[] args)
        {
            var baseTcpAddress = "net.tcp://localhost:8112";
            var host = new ServiceHost(typeof(MyService), new Uri(baseTcpAddress));

            host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(SecurityMode.None), "");

            var metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
            if (metadataBehavior == null)
            {
                metadataBehavior = new ServiceMetadataBehavior();
                //metadataBehavior.HttpGetEnabled = true;
                //metadataBehavior.HttpGetUrl = new Uri("http://localhost:8111");
                host.Description.Behaviors.Add(metadataBehavior);
            }
            host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");

            var unityBehavior = host.Description.Behaviors.Find<UnityServiceBehavior>();
            if (unityBehavior == null)
                host.Description.Behaviors.Add(new UnityServiceBehavior());

            host.Open();
            Console.WriteLine("Started");
            Console.ReadKey();
            host.Close();
        }
    }

    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        string MyMethod(int i);
    }

    public class MyService : IMyService
    {
        private IRepository<object> r;

        //public MyService() { }

        public MyService(IRepository<object> repository) { this.r = repository; }

        public string MyMethod(int i) { return "Called MyMethod int"; }
    }

    public interface IRepository<T> where T : class { }

    public class Repository<T> : IRepository<T> where T : class { }



Поведение добавляется. В поведении вызывается ApplyDispatchBehavior и ed.DispatchRuntime.InstanceProvider устанавливается дважды, так как в сервисе объявлено две конечных точки.
Однако вызовов методов UnityInstanceProvider при запуске приложения не происходит, а при попытке запросить метод службы с клиента получаем "Не удается активировать запрошенную службу " http://localhost:3109/MyService.svc". Дополнительные сведения см. в журналах диагностического отслеживания сервера."
Где я мог накосячить (и где эти журналы смотреть?)?
...
Рейтинг: 0 / 0
Инжекция зависимостей для WCF сервиса.
    #38041956
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

Меня ваша регистрация смущает, а потом обращение к http:/ ..../MyService.svc
Не скопипастили, или забыли в интерфейсе сервиса [ServiceContract]?

Попробуйте сначала просто:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
var baseTcpAddress = "http://localhost:8112/MyService";
var host = new ServiceHost(typeof(MyService), new Uri(baseTcpAddress));
......

var binding = new BasicHttpBinding {
                                                MaxBufferPoolSize = 2147483647,
                                                MaxReceivedMessageSize = 2147483647,
                                                ReaderQuotas = {
                                                                   MaxArrayLength = 2147483647,
                                                                   MaxBytesPerRead = 2147483647,
                                                                   MaxDepth = 32,
                                                                   MaxStringContentLength = 2147483647
                                                               }
                                            };
var factory = new ChannelFactory<IMyService>(binding);
factory.Open();
var svc = factory.CreateChannel(new EndpointAddress("http://localhost:8112/MyService"));
var channel = svc as IClientChannel;
channel.Open();
try {
    svc.MyMethod(10);
}
catch (FaultException ex) {
    ......
}
channel.Close();
factory.Close();
...
Рейтинг: 0 / 0
Инжекция зависимостей для WCF сервиса.
    #38042059
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tAZAR,

Спасибо, я уже разобрался. Невнимательность моя меня подвела. )
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Инжекция зависимостей для WCF сервиса.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]