Ответ 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/