‫۹ سال و ۱۲ ماه قبل، یکشنبه ۱۳ مهر ۱۳۹۳، ساعت ۱۸:۴۱
سلام؛ زیر ObjectFactoryیه خط سبز میاد و می‌نویسه :
Warning 
Structuremap.ObjectFactory is obsolete objectfactory will be removed future 4.0 release of structuremapfavor the usage of the container class for futur work
چطور می‌تونم برطرف کنم. ممنون
‫۱۰ سال و ۳ ماه قبل، چهارشنبه ۲۸ خرداد ۱۳۹۳، ساعت ۱۹:۳۸
من برای تزریق وابستگی استفاده کردم به درستی کار میکنه
ولی در یک موضوع به بن بست خوردم

public class EfOurServiceService : IOurServiceService
    {
        readonly IUnitOfWork _uow;
        readonly IDbSet<OurService> _ourServices;
        readonly IDbSet<OurServiceCategory> _ourServiceCategories;
        public EfOurServiceService(IUnitOfWork uow)
        {
            _uow = uow;
            _ourServices = _uow.Set<OurService>();
            _ourServiceCategories = _uow.Set<OurServiceCategory>();
        }


public IList GetMasterDetailsFilterLang(string language)
        {
            var query = (_ourServiceCategories
                           .Where(c => (c.Language == language))
                           .Select(
                              c =>
                                 new
                                 {
                                     CatId=c.Id,
                                     CatName=c.Title,
                                     OurServices = c.OurServices
                                        .Select(
                                           o =>
                                              new
                                              {
                                                 ServId= o.Id,
                                                 ServName= o.Title
                                              }
                                        )
                                 }
                           ));

            var ss = query.ToList();

//در اینجا که در لایه سرویس در پروژه ای جداگانه است به ایتم‌های کوئری دسترسی کامل دارم
            foreach (var master in ss)
            {
                var s = master.CatId;
                foreach (var details in master.OurServices)
                {
                    var cc = details.ServName;
                }
            }

            return ss;
        }
}

در اینجا که در لایه سرویس در پروژه ای جداگانه است به ایتم‌های کوئری دسترسی کامل دارم
اما زمانی که در پروژه UI که وب سایت Webform قرار داره به شکل زیر از این متود استفاده میکنم :

public string CreateServiceMnu()
    {
        var ds = OurServiceService.GetMasterDetailsFilterLang(_LangSar);

        foreach (var master in ds)
        {
            var s = master.CatId;
            foreach (var details in master.OurServices)
            {
                var cc = details.ServName;
            }
        }
        return string.Empty;
    }

اما به Property‌ها دسترسی ندارم : از IList استفاده کردم (پر میشه اما قابل دسترس نیست)

Linq to Sql

نمیدونم دلیلش چیه ؟

تو لایه Service به Property‌ها دسترسی دارم اما در لایه UI که وابستگی‌ها تزریق میشه Property‌ها قابل دسترس نیست.

 
‫۱۰ سال و ۴ ماه قبل، جمعه ۲۶ اردیبهشت ۱۳۹۳، ساعت ۰۶:۱۳
با MVC5 هم تستش کردم. مشکلی نبود. در GetControllerInstance فقط باید بررسی کنید که آیا controllerType نال هست یا خیر. اگر نال بود، یعنی یک آدرس یافت نشد در برنامه دارید:
if (controllerType == null && requestContext.HttpContext.Request.Url != null)
                throw new InvalidOperationException(string.Format("Page not found: {0}",
                    requestContext.HttpContext.Request.Url.AbsoluteUri.ToString(CultureInfo.InvariantCulture)));
‫۱۰ سال و ۴ ماه قبل، جمعه ۲۶ اردیبهشت ۱۳۹۳، ساعت ۰۳:۰۲
ممنون، ظاهراً با MVC5 سازگار نیست، ربطش رو نمی‌دونم ولی با MVC5 تست کردم مشکل داشت (از مقدار بازگشتی توسط متد GetControllerInstance اشکال می‌گرفت) ، با تعویض لایه وب به ورژن MVC4 مشکلم حل شد. مثالی تکمیلی مربوط به قسمت 12 سری EF شما هم برای ورژن MVC4 بود.
‫۱۰ سال و ۵ ماه قبل، شنبه ۲۰ اردیبهشت ۱۳۹۳، ساعت ۱۲:۵۰
ممنون؛ مراحل رو به این صورت انجام دادم :
static void InitStructureMap()
{
            ObjectFactory.Initialize(x =>
            {
                x.For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<MyContext>();
                x.Scan(scan =>
                {
                    scan.AssemblyContainingType<INewsService>();
                    scan.WithDefaultConventions();
                });
                
            });

            ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
            var container = ObjectFactory.Container;
            GlobalConfiguration.Configuration.Services
                .Replace(typeof(IHttpControllerActivator),
                new StructureMapHttpControllerActivator(container));
            
}
پیاده سازی StructureMapHttpControllerActivator به همان صورت که در لینک معرفی کردید انجام دادم.
ممنون از شما.
‫۱۰ سال و ۵ ماه قبل، شنبه ۲۰ اردیبهشت ۱۳۹۳، ساعت ۰۶:۱۶
یک نکته‌ی تکمیلی در مورد Web API
Mark Seemann توصیه کرده‌است که از IDependencyResolver استفاده نکنید. روش دیگری برای کار با Web API مورد تائید ایشان است:
Dependency Injection and Lifetime Management with ASP.NET Web API
Dependency Injection in ASP.NET Web API with Castle Windsor
پیاده سازی این نکته با StructureMap در اینجا:
Better way to configure StructureMap in ASP.NET WebAPI
‫۱۰ سال و ۵ ماه قبل، شنبه ۲۰ اردیبهشت ۱۳۹۳، ساعت ۰۳:۳۵
مانند همان توضیحات انتهای بحث است. فقط در متد BeginScope باید this بازگشت داده شود:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http.Dependencies;
using StructureMap;

    public class StructureMapDependencyResolver : IDependencyResolver
    {
        public IDependencyScope BeginScope()
        {
            return this;
        }

        public object GetService(Type serviceType)
        {
            if (serviceType.IsAbstract || serviceType.IsInterface || !serviceType.IsClass)
                return ObjectFactory.Container.TryGetInstance(serviceType);
            return ObjectFactory.GetInstance(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return ObjectFactory.GetAllInstances(serviceType).Cast<object>();
        }

        public void Dispose()
        { }
    }
‫۱۰ سال و ۵ ماه قبل، شنبه ۲۰ اردیبهشت ۱۳۹۳، ساعت ۰۱:۳۲
سلام؛
من در پروژه ام (یک برنامه ASP.NET MVC) یک کنترلر Web Api ایجاد کردم؛ در این حالت تنظیم DependencyResolver به چه صورت است؟ یعنی همزمان هم باید به این دو صورت تنظیم شود؟
protected void Application_Start()
{
   DependencyResolver.SetResolver(new StructureMapDependencyResolver());
   GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
}
در این حالت پیاده سازی StructureMapDependencyResolver به چه صورت خواهد بود؟
ممنون.