Подтвердить что ты не робот

Как использовать ServiceStack Funq в моих собственных проектах

На работе мы делаем несколько новых проектов веб-сервисов в ServiceStack и используем Funq в некоторых из них. В настоящее время я работаю над отдельным проектом, который будет использовать упомянутые веб-сервисы, и задавался вопросом, есть ли способ использовать ServiceStack Funq в моем проекте для разрешения моих зависимостей, чтобы использовать более или менее те же шаблоны, которые мы используем, когда разработка наших веб-сервисов.

Возможно ли это?

4b9b3361

Ответ 1

Я вхожу в аналогичную позицию, желая использовать кучи инструментов ServiceStack в проекте, отличном от webby. Я согласен с тем, что есть небольшая нехватка документации для Funq

Я использую его в устаревшем приложении WinForms, пытаясь избежать изменения исходного проекта (слишком много), и я добавляю новые формы в новый проект.
Я добавил ссылки на большинство библиотек ServiceStack на большинство моих проектов (вручную, потому что я делаю это в .Net 3.5)

Вот код в файле winforms Program.cs; Обратите внимание, что FunqContainer является общедоступным статическим свойством - я все еще не уверен в этом, но он дает доступ по всему проекту к FunqContainer

using System;
using System.Threading;
using System.Windows.Forms;

using Funq;
using MyApp.Utilities;

static class Program
    {
        public static Funq.Container FunqContainer { get; set; }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            FunqContainer = new Container();
            FunqContainer.Init(); 

            etc...
        }
    }

FunqContainer.Init() - это метод расширения в моем отдельном проекте, поскольку, как вы догадались, инициализация Funq

using System.Configuration; // Don't forget to ref System.Configuration.dll
using Funq;     
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.SqlServer;

namespace MyApp.Utilities
{
    public static class FunqExtensions
    {
        public static void Init(this Container container)
        {
            //-------------------------------------------------------
            // NB - I don't particularly like AutoWiring the public properties. 
            // Usually I want private stuff in the constructor)
            //-------------------------------------------------------
            var sqlServerConnectionString = ConfigurationManager.ConnectionStrings["HowdyCS"];
            container.Register<IDbConnectionFactory>(
                c => new OrmLiteConnectionFactory(
                    sqlServerConnectionString, 
                    SqlServerOrmLiteDialectProvider.Instance));

            container.Register<SomeForm>(
                c => new SomeForm(
                    c.Resolve<IDbConnectionFactory>()
                )
            ).ReusedWithin(ReuseScope.None);

        }
    }
}

Мне нравится использовать lamda в регистрации - он откладывает строительство объектов до тех пор, пока они не будут решены, а не во время регистрации.
По умолчанию контейнер хранит разрешенный объект как одноэлементный, но если у вас есть что-то, что нужно инициализировать каждый раз, когда оно используется (т.е. пользовательские элементы управления или winforms), используйте расширение .ReusedWithin(ReuseScope.None).

Где мне нужен мой SomeForm (т.е. нажатие кнопки или что-то еще)

...
private void btnOpenSomeForm_Click(object sender, EventArgs e)
{
    var myForm = Program.FunqContainer.Resolve<SomeForm>();
    myForm.Show();
}

Отметьте http://blogs.clariusconsulting.net/kzu/mab-containermodel-funq-a-transparent-container/ для получения дополнительной информации

В стороне, это также работает для VB.net, когда вы передаете его через http://converter.telerik.com/

Ответ 2

ServiceStack включает расширенную версию Funq (например, с поддержкой AutoWiring), которая является автономной в ядре ServiceStack.dll.

К сожалению, в это время ServiceStack.dll содержится в пакете ServiceStack NuGet, который приводит к другим зависимостям сервера ServiceStack. Вы можете построить его из src или набора вишни из пакета NuGet, только нужные вам dll, т.е.

  • ServiceStack.dll
  • ServiceStack.Common.dll
  • ServiceStack.Interfaces.dll
  • ServiceStack.Text.dll