ASP.NET Core'da uygulama modeliyle çalışma
Steve Smith tarafından
ASP.NET Core MVC, bir MVC uygulamasının bileşenlerini temsil eden bir uygulama modeli tanımlar. MVC öğelerinin nasıl davranacağını değiştirmek için bu modeli okuyun ve işin. Varsayılan olarak, MVC hangi sınıfların denetleyici olarak kabul edildiklerini, bu sınıflarda hangi yöntemlerin eylem olduğunu ve parametrelerin ve yönlendirmenin nasıl davranacağını belirlemek için belirli kuralları izler. Özel kuralları oluşturarak ve bunları genel olarak veya öznitelik olarak uygulayarak bu davranışı uygulamanın ihtiyaçlarına uyacak şekilde özelleştirin.
Modeller ve Sağlayıcılar ( IApplicationModelProvider )
MVC ASP.NET Core modeli, hem soyut arabirimleri hem de bir MVC uygulamasını açıklayan somut uygulama sınıflarını içerir. Bu model, MVC'nin uygulamanın denetleyicilerini, eylemlerini, eylem parametrelerini, yollarını ve filtrelerini varsayılan kurala göre keşfetmenin sonucu olur. Uygulama modeliyle çalışarak, bir uygulamayı varsayılan MVC davranışından farklı kuralları takip edecek şekilde değiştirebilirsiniz. Parametreler, adlar, yollar ve filtrelerin hepsi eylemler ve denetleyiciler için yapılandırma verileri olarak kullanılır.
MVC ASP.NET Core Modeli aşağıdaki yapıya sahiptir:
- ApplicationModel
- Denetleyiciler (ControllerModel)
- Eylemler (ActionModel)
- Parametreler (ParameterModel)
- Eylemler (ActionModel)
- Denetleyiciler (ControllerModel)
Modelin her düzeyi ortak bir koleksiyona erişime sahiptir ve düşük düzeyler hiyerarşide daha yüksek düzeyler tarafından ayarlanmış özellik değerlerine erişerek Properties değerlerin üzerine yazamaz. Özellikler, eylemler oluşturulduğunda ActionDescriptor.Properties içinde kalıcı olarak kullanılır. Bir istek işleniyorsa, eklenen veya değiştirilen bir kuralın tüm özelliklerine üzerinden ActionContext.ActionDescriptor erişilebilir. Özellikleri kullanmak, filtreleri, model bağlayıcıları ve diğer uygulama modeli yönlerini eylem başına yapılandırmanın harika bir yolutur.
Not
Koleksiyon, ActionDescriptor.Properties uygulama başlangıcından sonra iş parçacığı güvenli değildir (yazmalar için). Kural, bu koleksiyona güvenli bir şekilde veri eklemenin en iyi yoludur.
ASP.NET Core MVC, arabirim tarafından tanımlanan bir sağlayıcı deseni kullanarak uygulama modelini IApplicationModelProvider yükler. Bu bölümde, bu sağlayıcının nasıl işlevlerine ilişkin bazı iç uygulama ayrıntıları yer almaktadır. Sağlayıcı deseninin kullanımı, öncelikli olarak çerçeve kullanımı için gelişmiş bir konudur. Çoğu uygulama sağlayıcı desenini değil kuralları kullandır.
Arabirim uygulamaları, her uygulamanın özelliğine göre artan düzende çağıran IApplicationModelProvider OnProvidersExecuting "birbirini Order sarmalar". Yöntem OnProvidersExecuted daha sonra ters sırada çağrılır. Çerçeve çeşitli sağlayıcılar tanımlar:
İlk ( Order=-1000 ):
DefaultApplicationModelProvider
Ardından ( Order=-990 ):
AuthorizationApplicationModelProviderCorsApplicationModelProvider
Not
için aynı değere sahip iki sağlayıcının çağrılma sırası Order tanımlanmamıştır ve buna bağlı olmamaları gerekir.
Not
IApplicationModelProvider , çerçeve yazarlarının genişletmesi için gelişmiş bir kavramdır. Genel olarak, uygulamalar kuralları, çerçeveler de sağlayıcılar kullandırmalı. Önemli fark, sağlayıcıların her zaman kurallardan önce çalışmasıdır.
, DefaultApplicationModelProvider MVC tarafından kullanılan varsayılan davranışların çoğunu ASP.NET Core sağlar. Sorumlulukları şunlardır:
- Bağlama genel filtreler ekleme
- Bağlama denetleyici ekleme
- Genel denetleyici yöntemlerini eylem olarak ekleme
- Bağlama eylem yöntemi parametreleri ekleme
- Yol ve diğer öznitelikleri uygulama
Bazı yerleşik davranışlar tarafından DefaultApplicationModelProvider uygulanır. Bu sağlayıcı, , ve ControllerModel örneklerine başvuran ActionModel PropertyModel oluşturmakla ParameterModel sorumludur. sınıfı, DefaultApplicationModelProvider gelecekte değişecek bir iç çerçeve uygulama ayrıntısıdır.
AuthorizationApplicationModelProvider, ve öznitelikleriyle ilişkili davranışı AuthorizeFilter AllowAnonymousFilter uygulamakla sorumludur. Daha fazla bilgi için bkz. ASP.NET Core basit yetkilendirme.
ve CorsApplicationModelProvider ile ilişkili davranışı IEnableCorsAttribute IDisableCorsAttribute uygulanır. Daha fazla bilgi için bkz. Çıkış Noktası Arası İstekleri (CORS) ASP.NET Core.
Çerçevenin iç sağlayıcılarıyla ilgili bilgiler bu bölümde açıklanan .NET APItarayıcısı aracılığıyla kullanılamaz. Ancak sağlayıcılar, ASP.NET Core kaynağında (dotnet/aspnetcore GitHub depo) ince olabilir. Sağlayıcı GitHub sağlayıcılar bulmak için aramanızı kullanın ve Dalları/etiketleri değiştir açılan listesiyle kaynağın sürümünü seçin.
Kurallar
Uygulama modeli, modelin veya sağlayıcının tamamını geçersiz kılmaya göre modellerin davranışını özelleştirmek için daha basit bir yol sağlayan kural özetlerini tanımlar. Bu soyutlamalar, bir uygulamanın davranışını değiştirmenin önerilen yoludur. Kural, özelleştirmeleri dinamik olarak uygularken kod yazmanın bir yolunu sağlar. Filtreler çerçevenin davranışını değiştirmenin bir aracı sağlarken, özelleştirmeler uygulamanın tamamının birlikte nasıl çalıştığını denetlemeye izin verir.
Aşağıdaki kuralları kullanabilirsiniz:
- IApplicationModelConvention
- IControllerModelConvention
- IActionModelConvention
- IParameterModelConvention
Kural, bunları MVC seçeneklerine ekleyerek veya öznitelikler uygulanarak ve denetleyicilere, eylemlere veya eylem parametrelerine (filtrelere benzer) uygulanarak uygulanır. Filtrelerden farklı olarak, her istek kapsamında değil, yalnızca uygulama başlatıldıklarda kural yürütülür.
Not
Sayfalar rotası Razor ve uygulama modeli sağlayıcı kuralları hakkında bilgi için bkz. RazorSayfalarda yönlendirme ve uygulama kuralları ASP.NET Core .
ApplicationModel
Uygulama modeline özellik eklemek için aşağıdaki kural kullanılır:
using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace AppModelSample.Conventions
{
public class ApplicationDescription : IApplicationModelConvention
{
private readonly string _description;
public ApplicationDescription(string description)
{
_description = description;
}
public void Apply(ApplicationModel application)
{
application.Properties["description"] = _description;
}
}
}
Uygulama modeli kuralları, içinde MVC ekleniyorken seçenekler olarak Startup.ConfigureServices uygulanır:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Conventions.Add(new ApplicationDescription("My Application Description"));
options.Conventions.Add(new NamespaceRoutingConvention());
});
}
Özelliklere denetleyici eylemlerinin ActionDescriptor.Properties içinde koleksiyondan erişilebilir:
public class AppModelController : Controller
{
public string Description()
{
return "Description: " + ControllerContext.ActionDescriptor.Properties["description"];
}
}
Açıklamayı ControllerModel değiştirme
Denetleyici modeli özel özellikler de içerebilir. Özel özellikler, uygulama modelinde belirtilen aynı adla mevcut özellikleri geçersiz kılar. Aşağıdaki kural özniteliği denetleyici düzeyinde bir açıklama ekler:
using System;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace AppModelSample.Conventions
{
public class ControllerDescriptionAttribute : Attribute, IControllerModelConvention
{
private readonly string _description;
public ControllerDescriptionAttribute(string description)
{
_description = description;
}
public void Apply(ControllerModel controllerModel)
{
controllerModel.Properties["description"] = _description;
}
}
}
Bu kural bir denetleyicide öznitelik olarak uygulanır:
[ControllerDescription("Controller Description")]
public class DescriptionAttributesController : Controller
{
public string Index()
{
return "Description: " + ControllerContext.ActionDescriptor.Properties["description"];
}
Açıklamayı ActionModel değiştirme
Ayrı bir öznitelik kuralı, uygulama veya denetleyici düzeyinde zaten uygulanan davranışı geçersiz karak tek tek eylemlere uygulanabilir:
using System;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace AppModelSample.Conventions
{
public class ActionDescriptionAttribute : Attribute, IActionModelConvention
{
private readonly string _description;
public ActionDescriptionAttribute(string description)
{
_description = description;
}
public void Apply(ActionModel actionModel)
{
actionModel.Properties["description"] = _description;
}
}
}
Bunu denetleyici içindeki bir eyleme uygulamak, denetleyici düzeyi kuralı nasıl geçersiz k olduğunu gösterir:
[ControllerDescription("Controller Description")]
public class DescriptionAttributesController : Controller
{
public string Index()
{
return "Description: " + ControllerContext.ActionDescriptor.Properties["description"];
}
[ActionDescription("Action Description")]
public string UseActionDescriptionAttribute()
{
return "Description: " + ControllerContext.ActionDescriptor.Properties["description"];
}
}
ParameterModel
Eylem parametrelerinde değişiklik yapmak için aşağıdaki kural BindingInfo uygulanabilir. Aşağıdaki kural, parametresinin bir yol parametresi olması gerekir. Sorgu dizesi değerleri gibi diğer olası bağlama kaynakları yoksayılır:
using System;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace AppModelSample.Conventions
{
public class MustBeInRouteParameterModelConvention : Attribute, IParameterModelConvention
{
public void Apply(ParameterModel model)
{
if (model.BindingInfo == null)
{
model.BindingInfo = new BindingInfo();
}
model.BindingInfo.BindingSource = BindingSource.Path;
}
}
}
Özniteliği herhangi bir eylem parametresine uygulanabilir:
public class ParameterModelController : Controller
{
// Will bind: /ParameterModel/GetById/123
// WON'T bind: /ParameterModel/GetById?id=123
public string GetById([MustBeInRouteParameterModelConvention]int id)
{
return $"Bound to id: {id}";
}
}
Kuralı tüm eylem parametrelerine uygulamak için , içinde MustBeInRouteParameterModelConvention MvcOptions Startup.ConfigureServices ekleyin:
options.Conventions.Add(new MustBeInRouteParameterModelConvention());
Adı ActionModel değiştirme
Aşağıdaki kural, uygulandığı ActionModel eylemin adını güncelleştirmek için 'i değiştiren bir kuraldır. Yeni ad, özniteliğine parametre olarak sağlanır. Bu yeni ad yönlendirme tarafından kullanılır, bu nedenle bu eylem yöntemine ulaşmak için kullanılan yolu etkiler:
using System;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace AppModelSample.Conventions
{
public class CustomActionNameAttribute : Attribute, IActionModelConvention
{
private readonly string _actionName;
public CustomActionNameAttribute(string actionName)
{
_actionName = actionName;
}
public void Apply(ActionModel actionModel)
{
// this name will be used by routing
actionModel.ActionName = _actionName;
}
}
}
Bu öznitelik, içinde bir eylem yöntemine HomeController uygulanır:
// Route: /Home/MyCoolAction
[CustomActionName("MyCoolAction")]
public string SomeName()
{
return ControllerContext.ActionDescriptor.ActionName;
}
Yöntem adı olsa da, özniteliği yöntem adını kullanarak MVC kuralı geçersiz SomeName kılar ve eylem adını ile MyCoolAction değiştirir. Bu nedenle, bu eyleme ulaşmak için kullanılan yol şu /Home/MyCoolAction şekildedir: .
Not
Bu bölümdeki bu örnek temelde yerleşik ile ActionNameAttribute aynıdır.
Özel yönlendirme kuralı
Yönlendirmenin IApplicationModelConvention nasıl çalıştığını özelleştirmek için bir kullanın. Örneğin, aşağıdaki kural denetleyicilerin ad alanlarını yollarına dahil etmiştir ve ad alanındaki yerine . yol / içinde yer almaktadır:
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using System.Linq;
namespace AppModelSample.Conventions
{
public class NamespaceRoutingConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
var hasAttributeRouteModels = controller.Selectors
.Any(selector => selector.AttributeRouteModel != null);
if (!hasAttributeRouteModels
&& controller.ControllerName.Contains("Namespace")) // affect one controller in this sample
{
// Replace the . in the namespace with a / to create the attribute route
// Ex: MySite.Admin namespace will correspond to MySite/Admin attribute route
// Then attach [controller], [action] and optional {id?} token.
// [Controller] and [action] is replaced with the controller and action
// name to generate the final template
controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
{
Template = controller.ControllerType.Namespace.Replace('.', '/') + "/[controller]/[action]/{id?}"
};
}
}
// You can continue to put attribute route templates for the controller actions depending on the way you want them to behave
}
}
}
Kuralı içinde bir seçenek olarak Startup.ConfigureServices eklenir:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Conventions.Add(new ApplicationDescription("My Application Description"));
options.Conventions.Add(new NamespaceRoutingConvention());
});
}
İpucu
Aşağıdaki yaklaşımı kullanarak ara yazılıma MvcOptions kural ekleyin. Yer {CONVENTION} tutucu, şunları eklemek için gereken kuraldır:
services.Configure<MvcOptions>(c => c.Conventions.Add({CONVENTION}));
Aşağıdaki örnek, denetleyicinin adına sahip olduğu öznitelik yönlendirmesini kullanmayan yollara bir Namespace kural uygular:
using Microsoft.AspNetCore.Mvc;
namespace AppModelSample.Controllers
{
public class NamespaceRoutingController : Controller
{
// using NamespaceRoutingConvention
// route: /AppModelSample/Controllers/NamespaceRouting/Index
public string Index()
{
return "This demonstrates namespace routing.";
}
}
}
uygulama modeli kullanımı WebApiCompatShim
ASP.NET Core MVC, Web API 2'den ASP.NET kuralları kullanır. Özel kuralları kullanarak bir MVC ASP.NET Core davranışını web API'si uygulamasıyla tutarlı olacak şekilde değiştirebilirsiniz. Microsoft, WebApiCompatShim NuGet paketi özel olarak bu amaçla birlikte sunar.
Not
Web API'sini kullanarak ASP.NET için bkz. ASP.NET Web apı 'sinden ASP.NET Core geçir .
Web API Uyumluluk Dolgus'larını kullanmak için:
- Paketi
Microsoft.AspNetCore.Mvc.WebApiCompatShimprojeye ekleyin. - içinde çağırarak kuralları MVC'ye AddWebApiConventions
Startup.ConfigureServicesekleyin:
services.AddMvc().AddWebApiConventions();
Dolgu tarafından sağlanan kural, yalnızca uygulamanın belirli öznitelikleri uygulanmış olan bölümlerine uygulanır. Aşağıdaki dört öznitelik, hangi denetleyicilerin kendi kuralları dolgu kuralları tarafından değiştirilmiş olması gerektiğini kontrol etmek için kullanılır:
- UseWebApiActionConventionsAttribute
- UseWebApiOverloadingAttribute
- UseWebApiParameterConventionsAttribute
- UseWebApiRoutesAttribute
Eylem kuralları
UseWebApiActionConventionsAttribute HTTP yöntemini adlarına göre eylemlerle eşlemek için kullanılır (örneğin, Get ile HttpGet eşler). Yalnızca öznitelik yönlendirme kullanmayan eylemler için geçerlidir.
Aşırı Yükleme
UseWebApiOverloadingAttribute kuralı uygulamak için WebApiOverloadingApplicationModelConvention kullanılır. Bu kural, aday eylemleri isteğin isteğe bağlı olmayan tüm parametreleri karşılayan eylemlerle sınırlayan OverloadActionConstraint eylem seçim sürecine bir ekler.
Parametre kuralları
UseWebApiParameterConventionsAttribute eylem kuralı uygulamak WebApiParameterConventionsApplicationModelConvention için kullanılır. Bu kural, eylem parametreleri olarak kullanılan basit türlerin varsayılan olarak URI'den bağlanarak karmaşık türlerin istek gövdesinden bağlanarak bağlan olduğunu belirtir.
Yollar
UseWebApiRoutesAttribute denetleyici kuralı WebApiApplicationModelConvention uygulanıp uygulanmay olmadığını kontrol eder. Etkinleştirildiğinde, bu kural yol için alan desteği eklemek için kullanılır ve denetleyicinin alanda olduğunu api gösterir.
Uyumluluk paketi, bir kural kümesine ek olarak web API'si tarafından System.Web.Http.ApiController sağlanan sınıfın yerini alan bir temel sınıf içerir. Bu, web API'si için yazılmış ve MVC üzerinde çalışırken web API denetleyicilerinden devralınarak ApiController çalışmasına ASP.NET Core sağlar. Daha önce UseWebApi* listelenen tüm öznitelikler temel denetleyici sınıfına uygulanır. ApiController, web API'sinde bulunanlarla uyumlu özellikleri, yöntemleri ve sonuç türlerini gösterir.
Bir ApiExplorer uygulamayı belgeye ekleme
Uygulama modeli, her ApiExplorerModel düzeyde uygulamanın yapısını çapraz geçiş yapmak için kullanılan bir özelliği gösterir. Bu, Swagger gibi araçları kullanarak web API'leri için yardım sayfaları oluşturmak için kullanılabilir. ApiExplorerözelliği, uygulama IsVisible modelinin hangi bölümlerinin açığa çıkar olacağını belirtmek için ayarlan bir özelliği gösterir. Bu ayarı bir kural kullanarak yapılandırabilirsiniz:
using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace AppModelSample.Conventions
{
public class EnableApiExplorerApplicationConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
application.ApiExplorer.IsVisible = true;
}
}
}
Bu yaklaşımı (ve gerekirse ek kuralları) kullanarak API görünürlüğü bir uygulamanın herhangi bir düzeyinde etkinleştirilir veya devre dışı bırakılır.