2016-03-19 10 views
2

Kurucuda hizmetleri başlattığım bir ASP.NET MVC uygulamasına sahibim. Bu hizmetler, projede başka bir .dll işaret eder ve WCF hizmetleri değildir. Aşağıda kodumu göstermiştir:Denetleyicimin yapıcısında User.Identity.Name öğesine erişebilir miyim? Değilse, en iyi uygulama nedir?

[Authorise] 
public class OrderController : Controller 
{ 
    private OrderService _orderService; 

    public OrderController() 
    { 
     _orderService = new OrderLogic(User.Identity.Name); 
    } 

    public ActionResult Search() 
    { 
     //do stuff here including calling _orderLogic.Search(); 
    } 

    public ActionResult GetMyOrders() 
    { 
     //do stuff here including calling _orderLogic.GetMyOrders(); 
    } 

    //more actions here 
} 

public class OrderService 
{ 
    private string _username; 

    public OrderLogic(string username) 
    { 
     _username = username 
    } 

    public List<Order> Search() 
    { 
     //use _username in query here 
    } 

    public List<Order> GetMyOrders() 
    { 
     //use _username in query here 
    } 

    //more methods here 
} 

Yukarıdaki örnekte var Sorunum OrderService başlatmak zaman giriş yapmış olan kullanıcının adına geçmek zorunda olmasıdır. MVC lifecyle User.Identity'un bu aşamasında null'dur.

Kurucudaki geçerli kullanıcıya erişmenin bir yolu olduğunu sanmıyorum. Ayrıca, hizmeti her eylemde başlatmak veya geçerli kullanıcı için her yönteme geçmek istemiyorum. Bu senaryonun yaygın olduğuna eminim, en iyi uygulama nedir ve hangi seçeneklere sahibim? Bu soru bağımlılık enjeksiyon etiketiyle etiketlenmiş yana

+0

Temel soru: Kullanıcı giriş yaptı mı? Genel olarak, adsız erişimi önlemek için Sipariş sınıfınızı veya yönteminizi [Authorize] özelliğiyle süsleyebilirsiniz. –

+0

Kullanıcının oturum açtığını biliyorum. Denetleyicinin yapıcısında User.Identity'ye erişimim yok (bu nedenle OrderService'i başlatamıyorum). User.IDentity para cezasına eylemlerde erişebilirim. – user1786107

+0

Hizmetinizi Controller's Initialize yönteminde başlatmayı deneyin. Bu, http://stackoverflow.com/questions/1506254/how-to-get-user-identity-name-from-a-controller yardımcı olabilir. Veya kurucunuzda bir müşteri hizmeti enjekte etmek için IoC'yi kullanın http://forums.asp.net/t/1467424.aspx?Access+to+User+Identity+in+Controller+constructor –

cevap

2

, burada Oluşturucu Enjeksiyon kullanarak bunu yapmanın doğru yolu. Kumandanızda içine gerekli hizmeti enjekte:

public class OrderController : Controller 
{ 
    private OrderService _orderService; 

    public OrderController(OrderService orderService) 
    { 
     _orderService = orderService; 
    } 

    public ActionResult Search() 
    { 
     //do stuff here including calling _orderLogic.Search(); 
    } 

    public ActionResult GetMyOrders() 
    { 
     //do stuff here including calling _orderLogic.GetMyOrders(); 
    } 

    //more actions here 
} 

uygulamanızın Composition Roo t OrderController örneklerini oluşturun. my book detaylı olarak açıklandığı üzere, ASP.NET MVC ile size (DefaultControllerFactory türetmek en kolay olan) IControllerFactory uygulayarak bunu:

public class CompositionRoot : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == typeof(OrderController)) 
     { 
      return new OrderController(
       new OrderService(
        requestContext.HttpContext.User.Identity.Name)); 
     } 

     // handle other Controller types here... 
    } 
} 

SetControllerFactory ile özel IControllerFactory kaydedin.